Geçerli yürütme modülünü veya sınıf adını, içe aktarılan bir modül içinden dinamik olarak alabilmek istiyorum. İşte bazı kod:Geçerli yürütme modülüne veya sınıf adına Python'da nasıl erişebilirim?
foo.py:
def f():
print __name__
bar.py:
from foo import f
def b(): f()
Bu açıkça __name__
gibi çalışmıyor içeren modülün adıdır işlev. foo
modülüne erişmek istediğim, foo
kullanan geçerli yürütme modülünün adıdır. Yukarıdaki durumda, bar
olur, ancak başka bir modül foo
ithal edildiyse, foo
'un, bu modülün adında dinamik olarak erişmesini istiyorum.
Düzenleme:inspect
modülü oldukça umut verici görünüyor ama tam olarak aradığım şey değil. Beklediğim şey, mevcut yürütme modülünün adını içerecek erişebildiğim bir tür küresel veya ortam düzeyi değişkendi. Bu bilgiyi bulmak için yığının üstesinden gelmek istemediğimden değil - Python'un bu verileri zaten açığa çıkarmış olabileceğini düşündüm.
Düzenleme: Bunu nasıl kullanmaya çalıştığım İşte. Her ikisi de hataların dosyaya kaydedilmesi gereken iki farklı Django uygulamasına sahibim. "AppOne" ve "AppTwo" olarak adlandırıldığını söylüyoruz. Ayrıca şu dosyaları kaydetmeyi istediğim bir yer var: "/home/hare/app_logs
". Herhangi bir noktada her uygulamada, logger modülümü içe aktarabilmek ve log dizisini dosyaya yazan log fonksiyonunu çağırmak istiyorum. Ancak yapmak istediğim, her uygulamanın günlük dosyalarının ilgili günlük dizinlerinde yer alabilmesi için geçerli uygulamanın ("AppOne" veya "AppTwo") adı olan app_logs
'un altında bir dizin oluşturmaktır.
Bunu yapmak için, kayıt defteri modülünün, ana günlük dizininin yerini bilmekten sorumlu olan ve geçerli uygulamanın adını belirten bir tür küresel değişkene erişebilmesi için en iyi yolun olacağını düşündüm ve Henüz mevcut değilse, uygulamanın günlüğe kaydetme dizinini oluşturma.
Neden böyle sorumluluk tahsisini kırmak isteyeyim ? –
Bunu bir günlüğe kaydetme modülü içinde kullanıyorum - Arayanın bir tür anahtarı geçmesi gerekmeden hangi dış modülün oturum açmaya çalıştığını söylemek istiyorum. –
Program yürütme işlemini başlatan modülü bulmaya çalışıyorsunuz (yani: __name__ == '__main__' olan modül veya tam olarak foo.f() adı verilen modül, her defasında farklı olabilir foo.f() –