我无法将项目正确安装package_fiddler到我的虚拟环境中。
package_fiddler
我发现它MANIFEST.in 负责将 Package_fiddler-0.0.0.tar.gz执行时生成的非 .py 文件放入其中python setup.py sdist。
MANIFEST.in
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.
/home/username/.virtualenvs/virt_envir/local/lib/python2.7/site-packages
我已经尝试了许多设置参数的配置package_data,include_package_data但data_files我似乎每次都使用了错误的配置。
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
安装程序.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',])
清单文件
include README.rst recursive-include package_fiddler/data *
配置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(Chris的建议)
package_data={"data": ['package_fiddler/data',]}
配置6
这些配置都会导致 上根本没有安装任何文件/home/username/.virtualenvs/virt_envir/local/lib/python2.7/site-packages。
Toshio Kuratomi注意:在我原来的帖子中,为了清楚起见,我使用了最简单的树结构,其中出现此问题,但实际上我的树看起来更像下面的树。对于那棵树,奇怪的是,如果我只以某种方式放入一个__init__.py,文件夹stylesheets中的所有数据文件texts也会正确安装!这让我很困惑。
__init__.py
stylesheets
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
看起来你遇到了一些问题,无法将非Python文件正确地安装到你的包中。让我们来解决这个问题。
首先,要将非Python文件包含在你的包中,你需要正确配置setup.py和MANIFEST.in文件。
在setup.py中,你需要使用package_data参数来指定要包含在安装包中的数据文件。在MANIFEST.in文件中,你需要使用recursive-include命令来指定要包含的非Python文件。
recursive-include
下面是正确的配置:
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'], package_data={'package_fiddler': ['data/*.html', 'data/stylesheets/*.css']}, )
MANIFEST.in:
include README.rst recursive-include package_fiddler/data *.html recursive-include package_fiddler/data/stylesheets *.css
这样配置后,执行python setup.py sdist将会生成一个包含你的Python代码以及指定的数据文件的tar.gz文件。
当你执行pip install dist/Package_fiddler-0.0.0.tar.gz时,数据文件应该会被正确地安装到你的虚拟环境中。
pip install dist/Package_fiddler-0.0.0.tar.gz
如果你有其他文件夹或文件需要包含,可以相应地调整package_data和MANIFEST.in文件中的模式。
至于你第二个树结构,其中在stylesheets文件夹中只放置一个__init__.py文件就可以正确安装所有数据文件,可能是因为setuptools会将具有__init__.py文件的文件夹视为包,并自动包含其中的所有文件。但是,依赖这种行为可能不是最可靠的解决方案,最好还是像上面那样明确地指定package_data。