Python包中的相对文件路径

时间:2009-06-18 07:51:24

标签: python reference packages relative-path

如何相对于包的目录引用文件?

我的目录结构是:

    /foo
     package1/
      resources/
      __init__.py
     package2/
      resources/
      __init__.py
     script.py

script.py导入包package1package2。虽然可以通过系统上的任何其他脚本导入包。我应该如何引用内部的资源,比如package1,以确保os.path.curdir是任意的?

4 个答案:

答案 0 :(得分:16)

如果要引用foo/package1/resources文件夹中的文件,则需要使用模块的__file__变量。在foo/package1/__init__.py内:

from os import path
resources_dir = path.join(path.dirname(__file__), 'resources')

答案 1 :(得分:6)

一种简单/安全的方法是使用pkg_resources中的package1/___init___.py方法(与setuptools一起分发),如下所示:

from pkg_resources import resource_filename
filepath = resource_filename(__name__, 'resources/thefile')

或者,如果您在{{1}}内实施此内容:

{{1}}

这为您提供了一个干净的解决方案(如果我没有记错的话)拉链安全。

答案 2 :(得分:4)

如果您使用twisted.python.modules,则可以使用拉链保护,同时使用方便的API。

例如,如果我的data.txt中包含一些文本,而且sample.py位于一个目录中:

from twisted.python.modules import getModule
moduleDirectory = getModule(__name__).filePath.parent()
print repr(moduleDirectory.child("data.txt").open().read())

然后导入sample将执行此操作:

>>> import sample
'Hello, data!\n'
>>>

如果您的模块位于常规目录中,getModule(__name__).filePath将是FilePath;如果它在一个zip文件中,它将是ZipPath,它支持大多数但不是全部相同的API。

答案 3 :(得分:0)

这是个坏主意,因为如果您的软件包是作为压缩蛋安装的,那么资源就无法使用。

如果您使用setuptool,请不要忘记将zip_safe = False添加到setup.py配置中。

相关问题