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