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_datainclude_package_datadata_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',]