2009-03-03 16 views
46

假設我有兩個模塊:如何在Python中獲取__main__模塊的文件名?

a.py:

import b 
print __name__, __file__ 

b.py:

print __name__, __file__ 

我運行 「a.py」 文件。這將打印:

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

問題:我如何獲得來自「b.py」庫中的路徑__main__模塊(在這種情況下,「a.py」)?

回答

58
import __main__ 
print __main__.__file__ 
27

也許這將這樣的伎倆:

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

需要注意的是,爲了安全,你應該檢查__main__模塊是否具有__file__屬性。如果它是動態創建的,或只是被在交互式Python控制檯運行,它不會有一個__file__

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

一個簡單的hasattr()檢查將這樣的伎倆,以防止情況二:如果這是一個可能性在你的應用程序。

+0

它的確 - 謝謝! – 2009-03-03 14:29:54

+0

Wunderbar!我很高興能夠提供幫助。如果這確實回答你的問題,你會介意在問題上點擊「接受」按鈕嗎? :-) – 2009-03-03 14:33:01

+0

如果你編輯這個以使用「import __main__」風格,我會變回被接受的,因爲這比新接受的答案更詳細。 – 2009-03-03 16:57:50

14

下面的python代碼提供了額外的功能,包括它可以與py2exe可執行文件無縫協作。

我使用類似的代碼來找到相對於運行腳本的路徑,即__main__。作爲一個額外的好處,它可以運行包括Windows在內的跨平臺。

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') 

希望上面的例子可以提供額外的洞察如何確定正在運行的腳本的路徑...

1
import sys, os 

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

此功能將爲Python和用Cython編譯的程序工作。

6

另一種方法是使用sys.argv[0]

import os 
import sys 

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

sys.argv[0]將是一個空字符串,如果得到的Python開始-c或者從Python控制檯檢查。

相關問題