我无法将项目package_fiddler
正确安装到我的虚拟环境中。
我已经找到了原因,MANIFEST.in
负责将非.py文件放置在生成的Package_fiddler-0.0.0.tar.gz
中,该文件是通过执行python setup.py sdist
时生成的。
然后我执行了以下操作:
(virt_envir)$ pip install dist/Package_fiddler-0.0.0.tar.gz
但这并没有安装数据文件或将包安装到/home/username/.virtualenvs/virt_envir/local/lib/python2.7/site-packages
。
我尝试了许多setup
参数的配置:package_data
,include_package_data
和data_files
,但每次似乎都使用了错误的配置。
哪种package_data
和/或include_package_data
和/或data_files
的配置将正确地将package_fiddler
安装到我的虚拟环境中?
项目目录树
.
├── MANIFEST.in
├── package_fiddler
│ ├── data
│ │ ├── example.html
│ │ └── stylesheets
│ │ └── example.css
│ └── __init__.py
├── README.rst
└── setup.py
setup.py
from setuptools import setup
setup(
name='Package_fiddler',
entry_points={
'console_scripts': ['package_fiddler = package_fiddler:main', ],},
long_description=open('README.rst').read(),
packages=['package_fiddler',])
MANIFEST.in
include README.rst
recursive-include package_fiddler/data *
我尝试了哪些setup.py配置(以上代码库)?
配置1:
添加:
package_data={"": ['package_fiddler/data/*',]}
配置2
添加:
package_data={"": ['*.html', '*.css', '*.rst']}
配置3
添加:
include_package_data=True
配置4
添加:
package_data={"": ['package_fiddler/data',]}
移除:
packages=['package_fiddler',]
配置5(克里斯的建议)
添加:
package_data={"data": ['package_fiddler/data',]}
移除:
packages=['package_fiddler',]
配置6
添加:
package_data={"": ['package_fiddler/data/*',]}
移除:
packages=['package_fiddler',]
这些配置导致在/home/username/.virtualenvs/virt_envir/local/lib/python2.7/site-packages
上没有任何文件被安装。
编辑
致Toshio Kuratomi:
为了更清晰地阐述问题,我在原帖中使用了最简单的树形结构,但实际上我的树形结构看起来更像下面的树。对于这个树,仅在stylesheets
中放置__init__.py
,竟然可以正确安装texts
文件夹中的所有数据文件!这让我感到困惑。
树形结构 2(以某种方式正确安装了所有数据文件!!)
.
├── MANIFEST.in
├── package_fiddler
│ │── stylesheets
| | ├── __init__.py
| | ├── example.css
| | └── other
| | └── example2.css
| |__ texts
| | ├── example.txt
| | └── other
| | └── example2.txt
│ └── __init__.py
├── README.rst
└── setup.py
__init__.py
的把戏。 - rspeer__init__.py
的hack对我没有用,因为我已经在我的树中放置了init文件!此外,init技巧对于非Python数据文件也无济于事。 - gaborouspackage_data = ...
并从数据子目录中删除__init__.py
文件:使用此方法不需要它们。只需使用MANIFEST.in并设置include_package_data=True即可。我遇到的另一件事是,MANIFEST.in中的数据文件需要位于Python代码子树下(至少一个检测到的包的子树),否则它们将无法安装。 - init_jsos.path.dirname(__file__)
路径算法从 MANIFEST.in 加载文件,则添加 zip_safe=False 可能有助于确保正确性(省略 zip_false 将让 bdist_egg 通过文件检查推断是否安全)文档。参见 其他答案。 - init_js