【发布时间】:2018-07-12 02:35:59
【问题描述】:
我有点迷失在所有可以添加数据文件的位置。
首先,有MANIFEST.in 文件。据我了解,这只是为了指定要包含在“源代码分发”中的源文件。
然后,有setup() 函数的data_files 参数,您可以在其中列出应该安装的文件,但它来自根目录(/ 或~user/.local)。最后,还有package_data 假装做我想做的事……但在bdist 上,我看不出与data_files 有什么区别
我有一个数据文件,比如“default_conf.cfg”。
我的MANIFEST.in 包含:
include default_conf.cfg
还有我的setup.py:
setup(
# ...
package_data={
'': ['default_conf.cfg'],
}
)
当我执行./setup.py sdist 时,包含该文件,与./setup.py bdist 相同(如预期)
但是,如果我尝试安装为可编辑包 (pip install --user -e .),我无法使用 pkg_resources.resource_string(__name__, 'default_conf.cfg') 访问它
在分发/安装时能够从任何类型访问它,我缺少什么?
(文档非常冗长,信息分散在几个页面中,因此很容易遗漏一些内容。)
编辑
我把我的数据文件作为我模块的子目录,它似乎更好:
my_pkg/
|-my_pkg/
| |-__init__.py
| |-data/
| | |-default_conf.cfg
|
|-setup.py
setup.py:
setup(
# ...
package_data={
'my_module': ['data/default_conf.cfg'],
}
)
但是,当我尝试pip install --user -e .时,.egg-link的内容是/.../my_pkg/build/lib而不是/.../my_pkg,那么当然,它不是实时可编辑的...为什么setuptools使用这个路径?
【问题讨论】:
-
什么是
pkg_resource? -
setuptools.readthedocs.io/en/latest/pkg_resources.html 访问资源的“标准方式”(通常)
-
好吧,有一个复制粘贴错字,现在,我将调用更正为
resource_string -
您的
package_data现在是正确的,所以它应该可以工作。首先,尝试清理:pip uninstall -y mypkg,删除项目目录中的build和mypkg.egg-info目录,然后重新运行pip install --editable .。如果这没有帮助,请检查您的项目目录中是否有不必要的__init__.py并将其删除。 -
“不必要的
__init__.py" ? because I effectively have an empty__init__.py”是什么意思,因为我只有子模块
标签: python python-3.x setuptools packaging pkg-resources