如何在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”)的path?

 import __main__ print __main__.__file__ 

也许这将有诀窍:

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

请注意,为了安全起见,您应该检查__main__模块是否具有__file__属性。 如果它是dynamic创build的,或者只是在交互式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()检查将做的伎俩,以防止情况2,如果这是在您的应用程序的可能性。

下面的python代码提供了额外的function,包括它可以与py2exe可执行文件无缝py2exe

我使用类似的代码来find相对于运行脚本的path,也就是__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') 

希望上面的示例代码可以提供有关如何确定正在运行的脚本的path的其他信息…

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

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

如果Python从-c开始或者从Python控制台检查,则sys.argv[0]将是一个空string。

 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编译的程序。