2009-03-03 95 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控制台检查。

相关问题