使用__file__获取Python模块的绝对路径的不同方法

0 投票
2 回答
913 浏览
提问于 2025-04-18 04:31

在我的应用程序中,有一个设置的 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)

撰写回答