如何相对引用文件包的目录?
我的目录结构:
/foo package1/ resources/ __init__.py package2/ resources/ __init__.py script.py
script.py
进口套餐package1
和package2
。 虽然包可以通过系统上的任何其它脚本来进行导入。 我应该如何内侧基准资源,说, package1
,以确保它会在情况下工作os.path.curdir
是任意的?
如何相对引用文件包的目录?
我的目录结构:
/foo package1/ resources/ __init__.py package2/ resources/ __init__.py script.py
script.py
进口套餐package1
和package2
。 虽然包可以通过系统上的任何其它脚本来进行导入。 我应该如何内侧基准资源,说, package1
,以确保它会在情况下工作os.path.curdir
是任意的?
如果你想从参考文件foo/package1/resources
文件夹,你会想用__file__
模块的变量。 里面foo/package1/__init__.py
:
from os import path
resources_dir = path.join(path.dirname(__file__), 'resources')
一个简单的/安全的方式来做到这一点是使用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')
这给你一个干净的解决方案,这也是(如果我没有记错的话)拉链安全。
你可以压缩安全,并在同一时间,如果你使用使用一个很好的方便的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。
这是一个坏主意,因为如果你的包被安装为拉链鸡蛋,那么资源可能不可用。
如果使用setuptool,不要忘记zip_safe =假添加到setup.py配置。