带有__file__的Python绝对路径,用于称为不同方式的模块

时间:2014-04-27 23:33:15

标签: 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"))

问题是我希望/ orotot/ha/modules/modulename/setup.py无论在何处调用都能正常工作。

如果我在modules / modulename中并运行python setup.py它没关系,但如果我从上面的目录运行它/我会收到此错误

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 :(得分:1)

execfile不会修改全局变量(如__file__),因此exectued脚本确实会采用不正确的路径。

您可以将全局变量传递给execfile,以便修改其__file__变量:

script = os.path.join(root, module, "setup.py")
if os.path.isfile(script):
    g = globals().copy()
    g['__file__'] = script
    execfile(script, g)

答案 1 :(得分:0)

如果您需要访问某些软件包中的文件,请考虑使用此处记录的pkg_resourceshttp://pythonhosted.org/setuptools/pkg_resources.html#basic-resource-access

获取作为名为package的包的一部分存储的文件内容的示例位于此SO answer