【发布时间】:2020-10-14 11:17:43
【问题描述】:
我正在尝试打包一系列配置文件以及一些源代码。我有一个这样的目录结构(由于团队的性质,我无法更改)
.
├── configs
│ ├── machines
│ ├── scope
├── esm_tools
│ ├── __init__.py
├── README.rst
├── setup.cfg
├── setup.py
61 directories, 45 files (Truncated)
据我了解 (https://docs.python.org/3/distutils/setupscript.html#installing-package-data),我可以在 setup 调用中添加一些部分:
setup(
# ... other stuff
include_package_data=True,
name="esm_tools",
packages=["configs", "esm_tools"],
package_dir={"configs": "configs", "esm_tools": "esm_tools"},
package_data={'configs': ['*']},
version="4.1.5",
zip_safe=False,
)
但是,我无法通过以下方式访问包数据:
In [1]: import pkg_resources
In [2]: pkg_resources.resource_listdir("esm_tools", "config")
---------------------------------------------------------------------------
FileNotFoundError Traceback (most recent call last)
<ipython-input-2-f0f255c14df6> in <module>
----> 1 pkg_resources.resource_listdir("esm_tools", "config")
/global/AWIsoft/miniconda/4.7.12/lib/python3.7/site-packages/pkg_resources/__init__.py in resource_listdir(self, package_or_requirement, resource_name)
1161 """List the contents of the named resource directory"""
1162 return get_provider(package_or_requirement).resource_listdir(
-> 1163 resource_name
1164 )
1165
/global/AWIsoft/miniconda/4.7.12/lib/python3.7/site-packages/pkg_resources/__init__.py in resource_listdir(self, resource_name)
1439
1440 def resource_listdir(self, resource_name):
-> 1441 return self._listdir(self._fn(self.module_path, resource_name))
1442
1443 def metadata_listdir(self, name):
/global/AWIsoft/miniconda/4.7.12/lib/python3.7/site-packages/pkg_resources/__init__.py in _listdir(self, path)
1608
1609 def _listdir(self, path):
-> 1610 return os.listdir(path)
1611
1612 def get_resource_stream(self, manager, resource_name):
FileNotFoundError: [Errno 2] No such file or directory: '/home/ollie/pgierz/dev/esm_tools/esm_tools/esm_tools/config'
任何帮助将不胜感激,我不确定我做错了什么......
【问题讨论】:
-
所以安装后
configs/machines应该可以在esm_tools/config/machines下访问? -
你能展示一下
pkg_resources/__init__.py里面的内容吗?从您的回溯中,很明显您的路径是错误的:'/home/ollie/pgierz/dev/esm_tools/esm_tools/esm_tools/config'。esm_tools路径中的 3 次都不对。所以看看get_provider函数做了什么会很有帮助。 -
@DmitriiAltukhov
get_provideris part ofsetuptools. -
@pgierz 如果您想在已安装的包中将
configs重新映射到esm_tools/config,可以这样做,但 AFAIK 不适用于可编辑安装。否则,您当前的设置包括configs作为一个单独的包(即使它是一个命名空间),所以pkg_resources.resource_listdir('configs')应该可以工作。您正在调用pkg_resources.resource_listdir("esm_tools", "config"),这实际上是“在esm_tools下查找目录config”,而当前的设置是无法获得的。 -
这是可能的,但同样,可编辑安装不支持该 AFAIK,因此您必须为本地开发构建解决方法。我会尽快添加答案。
标签: python setuptools python-packaging