使用__file__获取Python模块的绝对路径的不同方法
在我的应用程序中,有一个设置的 Python 脚本(/root/ha/setup.py),它会查看一个叫做 modules 的文件夹,并在每个子文件夹中运行 setup.py。
相关的代码是这样的:
""" Exec the module's own setup file """
if os.path.isfile(os.path.join(root, module, "setup.py")):
execfile(os.path.join(root, module, "setup.py"))
问题是,我希望无论从哪里调用 /root/ha/modules/modulename/setup.py,它都能正常工作。
如果我在 modules/modulename 文件夹里运行 python setup.py,那是没问题的,但如果我在上一级目录 modules/ 中运行,就会出现这个错误:
idFile = open(os.path.dirname(os.path.abspath(__file__)) + "/id.txt", "r").read()
IOError: [Errno 2] No such file or directory: '/root/ha/id.txt'
正如你所看到的,它获取的是调用它的脚本的路径,而不是正在运行的脚本的路径。它应该尝试读取 /root/ha/modules/modulename/id.txt。
我尝试了不同的方法来获取路径,但最后都出现了这个错误……
2 个回答
0
如果你想从你的某个包里访问一个文件,可以考虑使用 pkg_resources
,具体的用法可以在这里找到:http://pythonhosted.org/setuptools/pkg_resources.html#basic-resource-access
关于如何获取一个名为 package
的包中存储的文件内容的例子,可以参考这个 StackOverflow的回答
1
execfile
这个函数不会改变全局变量(比如 __file__
),所以执行的脚本会用错路径。
你可以把全局变量传给 execfile
,这样就可以修改它的 __file__
变量:
script = os.path.join(root, module, "setup.py")
if os.path.isfile(script):
g = globals().copy()
g['__file__'] = script
execfile(script, g)