我有一个名为
clana
(Github,PyPI)的包,其结构如下:
.
├── clana
│ ├── cli.py
│ ├── config.yaml
│ ├── __init__.py
│ ├── utils.py
│ └── visualize_predictions.py
├── docs/
├── setup.cfg
├── setup.py
├── tests/
└── tox.ini
setup.py 看起来像这样:
from setuptools import find_packages
from setuptools import setup
requires_tests = [...]
install_requires = [...]
config = {
"name": "clana",
"version": "0.3.6",
"author": "Martin Thoma",
"author_email": "[email protected]",
"maintainer": "Martin Thoma",
"maintainer_email": "[email protected]",
"packages": find_packages(),
"entry_points": {"console_scripts": ["clana=clana.cli:entry_point"]},
"install_requires": install_requires,
"tests_require": requires_tests,
"package_data": {"clana": ["clana/config.yaml"]},
"include_package_data": True,
"zip_safe": False,
}
setup(**config)
python3 setup.py sdist
open dist/clana-0.3.8.tar.gz # config.yaml is not in this file
我认为这可以确保安装软件包时
config.yaml
与 cli.py
位于同一目录中。但是当我尝试这个时:
virtualenv venv
source venv/bin/activate
pip install clana
cd venv/lib/python3.6/site-packages/clana
ls
我得到:
cli.py __init__.py __pycache__ utils.py visualize_predictions.py
我上传到PyPI的方式:
python3 setup.py sdist bdist_wheel && twine upload dist/*
所以
config.yaml
丢失了。我怎样才能确定它在那里?
您可以在
MANIFEST.in
旁边添加文件名 setup.py
以及要添加的文件列表,允许使用通配符(例如:include *.yaml
或 include clana/config.yaml
)
那么选项 include_package_data=True
将激活清单文件
简而言之:将
config.yaml
添加到MANIFEST.in
,并设置include_package_data
。缺一不可。
基本上是这样的:
MANIFEST.in
将文件添加到 sdist
(源分发)。include_package_data
将这些相同的文件添加到 bdist
(构建的发行版),即将 MANIFEST.in
的效果扩展到 bdist
。exclude_package_data
防止 sdist
中的文件添加到 bdist
,即过滤 include_package_data
的效果。package_data
将文件添加到 bdist
,即将构建工件(通常是自定义构建步骤的产品)添加到您的 bdist
,当然对 sdist
没有影响。因此,在您的情况下,文件
config.yaml
未安装,因为它未添加到您的bdist
(内置发行版)。根据文件的来源,有两种方法可以解决此问题:
该文件是构建工件(通常是在
./setup.py build
阶段以某种方式创建的),那么您需要将其添加到 package_data
;
或者该文件是您源代码的一部分(通常位于您的源代码存储库中),那么您需要将其添加到
MANIFEST.in
,设置 include_package_data
,并将其保留在 exclude_package_data
之外(这似乎是你的情况在这里)。
相关:
根据包含数据文件的文档,如果您的包有数据文件,例如
.yaml
文件,您可以像这样包含它们:
setup(
...
package_data={
"": ["*.yaml"],
},
...
)
这将允许包含文件扩展名为
.yaml
的包中的任何文件。