在Python包的相对文件路径(Relative file paths in Python pack

2019-06-23 13:04发布

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

我的目录结构:

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

script.py进口套餐package1package2 。 虽然包可以通过系统上的任何其它脚本来进行导入。 我应该如何内侧基准资源,说, package1 ,以确保它会在情况下工作os.path.curdir是任意的?

Answer 1:

如果你想从参考文件foo/package1/resources文件夹,你会想用__file__模块的变量。 里面foo/package1/__init__.py

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


Answer 2:

一个简单的/安全的方式来做到这一点是使用resource_filename从方法通过pkg_resources (其与分布式setuptools的 ),如下所示:

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

或者,如果您正在实施这里面package1/___init___.py

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

这给你一个干净的解决方案,这也是(如果我没有记错的话)拉链安全。



Answer 3:

你可以压缩安全,并在同一时间,如果你使用使用一个很好的方便的API twisted.python.modules 。

举例来说,如果我有一个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将是一个文件路径 ; 如果它在一个zip文件,这将是一个ZipPath ,它支持大多数,但不是所有的相同的API。



Answer 4:

这是一个坏主意,因为如果你的包被安装为拉链鸡蛋,那么资源可能不可用。

如果使用setuptool,不要忘记zip_safe =假添加到setup.py配置。



文章来源: Relative file paths in Python packages