我正在编写一个python包,其中包含需要打开./data/
子目录中的数据文件的模块。现在我已经将文件的路径硬编码到我的类和函数中。我想编写更健壮的代码,无论它安装在用户系统的什么位置,都可以访问子目录。
我已经尝试了各种方法,但到目前为止还没有成功。似乎大多数“当前目录”命令都返回系统的python解释器的目录,而不是模块的目录。
这似乎应该是一个微不足道的、常见的问题。然而,我似乎想不出来。部分问题是我的数据文件不是.py
文件,所以我不能使用导入函数等。
有什么建议吗?
现在,我的包目录如下所示:
/
__init__.py
module1.py
module2.py
data/
data.txt
我正在尝试从module*.py
访问data.txt
!
发布于 2009-04-22 22:37:04
您可以使用__file__
获取包的路径,如下所示:
import os
this_dir, this_filename = os.path.split(__file__)
DATA_PATH = os.path.join(this_dir, "data", "data.txt")
print open(DATA_PATH).read()
发布于 2011-04-09 07:42:39
执行此操作的标准方法是使用setuptools包和pkg_resources。
您可以根据以下层次结构布局您的包,并配置包安装文件,使其指向您的数据资源,如此链接所示:
http://docs.python.org/distutils/setupscript.html#installing-package-data
然后,您可以使用pkg_resources重新查找和使用这些文件,如下所示:
http://peak.telecommunity.com/DevCenter/PkgResources#basic-resource-access
import pkg_resources
DATA_PATH = pkg_resources.resource_filename('<package name>', 'data/')
DB_FILE = pkg_resources.resource_filename('<package name>', 'data/sqlite.db')
发布于 2015-12-10 17:59:34
你需要为你的整个模块命名,你得到的目录树没有列出那个细节,对我来说这是可行的:
import pkg_resources
print(
pkg_resources.resource_filename(__name__, 'data/data.txt')
)
值得注意的是,setuptools似乎不能根据与压缩数据文件匹配的名称来解析文件,所以无论如何你都必须包含data/
前缀。如果你需要备用的目录分隔符,你可以使用os.path.join('data', 'data.txt)
,不过我发现通常与硬编码的unix风格的目录分隔符没有兼容性问题。
https://stackoverflow.com/questions/779495
复制相似问题