2009-03-03 18 views
46

varsayalım İki modül vardır:Python'da __main__ modülünün dosya adı nasıl alınır?

a.py:

import b 
print __name__, __file__ 

b.py:

print __name__, __file__ 

ben "a.py" dosyasını çalıştırın. Bu baskılar:

b  C:\path\to\code\b.py 
__main__ C:\path\to\code\a.py 

Soru: nasıl "b.py" kütüphanesinden içinden __main__ modül (bu durumda "a.py") yolunu edinir?

cevap

58
import __main__ 
print __main__.__file__ 
+1

Temiz! Birinin __main__ dosyasını içe aktarması gerektiğini fark etmek önemlidir - rastgele bir tahminde bulundum ve ikinci satırı denedim, ancak başarısız oldu - şimdi nedenini biliyorum. –

+17

'__main__' her zaman '__file__' özniteliğine sahip değil. – jfs

+0

Evet, cevabın bunu belirtmek için güncellenmesi güzel olurdu. –

27

Belki de bu hile olacaktır: güvenliği için, sen __main__ modül __file__ niteliği olup olmadığını kontrol etmelidir

import sys 
from os import path 
print path.abspath(sys.modules['__main__'].__file__) 

Not. Bu bir olasılık ise

python 
>>> import sys 
>>> print sys.modules['__main__'] 
<module '__main__' (built-in)> 
>>> print sys.modules['__main__'].__file__ 
AttributeError: 'module' object has no attribute '__file__' 

Basit hasattr() onay senaryo 2 karşı korumak için hile olacaktır: dinamik yarattı, ya da sadece etkileşimli piton konsolunda çalıştırmak ediliyorsa, bu bir __file__ olmaz uygulamanızda.

+0

Yapıyor - teşekkürler! –

+0

Wunderbar! Yardım edebileceğime sevindim. Eğer bu soruya cevap verirse, sorudaki 'kabul et' düğmesine basmak ister misiniz? :-) –

+0

"import __main__" stilini kullanmak için bunu düzenlerseniz, kabul edilene geri dönerim, çünkü bu yeni kabul edilen yanıttan daha ayrıntılıdır. –

14

piton Aşağıdaki kod bu py2exe yürütülebilir ile sorunsuz bir şekilde çalıştığını kapsayan ek işlevsellik sağlar.

Çalışan kod için __main__ numaralı bağlantı yollarını bulmak için benzer kodları kullanıyorum. Ek bir avantaj olarak, Windows dahil olmak üzere çapraz platform çalışır.

import imp 
import os 
import sys 

def main_is_frozen(): 
    return (hasattr(sys, "frozen") or # new py2exe 
      hasattr(sys, "importers") # old py2exe 
      or imp.is_frozen("__main__")) # tools/freeze 

def get_main_dir(): 
    if main_is_frozen(): 
     # print 'Running from path', os.path.dirname(sys.executable) 
     return os.path.dirname(sys.executable) 
    return os.path.dirname(sys.argv[0]) 

# find path to where we are running 
path_to_script=get_main_dir() 

# OPTIONAL: 
# add the sibling 'lib' dir to our module search path 
lib_path = os.path.join(get_main_dir(), os.path.pardir, 'lib') 
sys.path.insert(0, lib_path) 

# OPTIONAL: 
# use info to find relative data files in 'data' subdir 
datafile1 = os.path.join(get_main_dir(), 'data', 'file1') 

Umarım Yukarıdaki örnek kod ... Çalışan bir komut dosyasının yolunu nasıl belirleneceği ek analiz sağlayabilir

+1

Başlatma arasında dizini (os.chdir' ile) değiştirirseniz komut dosyası ve 'os.dirname (sys.argv [0])' ifadesiyle sonuç anlamsızdır. – RobM

+0

En azından ana kod tarafından içe aktarılan, kodun üzerinde bir şey yürüten ve sonucu bir "MAINDIR" dosyasında saklayan bir "GLOBALS.py" modülü oluşturmak için kullanıyorum, böylece "GLOBALS.MAINDIR" dosyasına erişebiliyorum Başka bir modülden, 'os.chdir' kullanımını endişe etmeden. – Remi

+0

Eğer betiğinizin başlangıç ​​dizinini öğrenmek istiyorsanız ve os.chdir() işlevini de kullanmak istiyorsanız, ilk os.getcwd() 'yi kaydetmek isteyeceksiniz. Kullanıcı pencerelerde olduğundan, hala py2exe ve freeze bağlamında çalışacak bir şey göstermek istedim. – popcnt

1
import sys, os 

def getExecPath(): 
    try: 
     sFile = os.path.abspath(sys.modules['__main__'].__file__) 
    except: 
     sFile = sys.executable 
    return os.path.dirname(sFile) 

Bu fonksiyon Python ve Cython derlenmiş programlar için çalışacaktır.

6

Başka bir yöntem sys.argv[0] kullanmak olacaktır. Python -c ile başlamak veya Python konsolundan kontrol eğer alırsa

import os 
import sys 

main_file = os.path.realpath(sys.argv[0]) if sys.argv[0] else None 

sys.argv[0] boş bir dize olacaktır.

İlgili konular