Python包装:数据文件正确地放在tar.gz文件中,但是没有安装到虚拟环境中
我无法正确安装项目package_fiddler
到我的虚拟环境。
我发现MANIFEST.in
负责将non.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
。
我已经尝试了许多configuration参数package_data
, include_package_data
和data_files
但我似乎每次都使用了错误的configuration。
package_data
和/或include_package_data
和/或data_files
哪个configuration会正确地将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(以上代码库)的哪些configuration我试过了?
configuration1
添加:
package_data={"": ['package_fiddler/data/*',]}
Configuration2
添加:
package_data={"": ['*.html', '*.css', '*.rst']}
Configuration3
添加:
include_package_data=True
Configuration4
添加:
package_data={"": ['package_fiddler/data',]}
删除:
packages=['package_fiddler',]
configuration5 (克里斯的build议)
添加:
package_data={"data": ['package_fiddler/data',]}
删除:
packages=['package_fiddler',]
configuration6
添加:
package_data={"": ['package_fiddler/data/*',]}
删除:
packages=['package_fiddler',]
这些configuration都不会导致安装在/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
我个人不喜欢setuptools混合代码和数据的概念和实现的方式。 我认为这是让你在这里的实施。 为了setuptoolsfind并使用package_data它需要数据驻留在一个python包内。 一个python包可以是一个目录,但是目录中需要有一个__init__.py
文件。 所以它看起来像你需要以下(空是好的)文件:
./package_fiddler/data/__init__.py ./package_fiddler/data/stylesheets/__init__.py
find一个解决scheme,在我这里工作 。
使用setuptools==2.0.2
我做了:
setuptools.setup( ... packages=setuptools.find_packages(), include_package_data=True, # use MANIFEST.in during install ... )
在“setup.py”中包含软件包数据的最简单的方法是这样的:
package_data = {'<package name>': ['<path to data file within package dir>']}
所以在你的例子中:
package_data = {'package_fiddler': ['data/*', 'data/stylesheets/*']}
package_data
是一个字典,其中的键是安装程序中包含的软件包的名称。 这些键下的值应该是软件包目录中的特定文件path或球/通配符列表。
您还需要包含标志:
zip_safe=False
在setup(...)
如果你想能够解决文件系统path到您的数据。 否则,您可以使用pkg_resources
来执行此操作: http : pkg_resources
你肯定不需要在“数据”目录中有一个__init__.py
文件 – 这个目录不是一个模块,并且不能被导入。
这对我有用。 希望能帮助到你。
package_data={ "package_fiddler": [ '\*.\*', '\*/\*.\*', '\*/\*/\*.\*', ], },
使用
package_data={"data": ['package_fiddler/data',]}
代替
packages=['package_fiddler',]