Python打包:数据文件正确放在tar.gz文件中,但未安装到虚拟环境中

Ben*_*ey4 42 python packaging setuptools setup.py

我无法将项目正确安装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.

我已经试过的设置参数许多配置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
Run Code Online (Sandbox Code Playgroud)

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',])
Run Code Online (Sandbox Code Playgroud)

MANIFEST.in

include README.rst
recursive-include package_fiddler/data *
Run Code Online (Sandbox Code Playgroud)

我尝试过哪些setup.py配置(上面有代码库)?

配置1

添加:

package_data={"": ['package_fiddler/data/*',]}
Run Code Online (Sandbox Code Playgroud)

Configuration2

添加:

package_data={"": ['*.html', '*.css', '*.rst']}
Run Code Online (Sandbox Code Playgroud)

Configuration3

添加:

include_package_data=True
Run Code Online (Sandbox Code Playgroud)

Configuration4

添加:

package_data={"": ['package_fiddler/data',]}
Run Code Online (Sandbox Code Playgroud)

删除:

packages=['package_fiddler',]
Run Code Online (Sandbox Code Playgroud)

配置5(克里斯的建议)

添加:

package_data={"data": ['package_fiddler/data',]}
Run Code Online (Sandbox Code Playgroud)

删除:

packages=['package_fiddler',]
Run Code Online (Sandbox Code Playgroud)

配置6

添加:

package_data={"": ['package_fiddler/data/*',]}
Run Code Online (Sandbox Code Playgroud)

删除:

packages=['package_fiddler',]
Run Code Online (Sandbox Code Playgroud)

这些配置都导致根本没有安装任何文件/home/username/.virtualenvs/virt_envir/local/lib/python2.7/site-packages.

编辑

Toshio Kuratomi的注意事项:在我的原始帖子中,我使用了最简单的树结构,为了清楚起见出现了这个问题,但实际上我的树看起来更像下面的树.对于那棵树,奇怪的是,如果我只是__init__.pystylesheets某种方式放置文件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
Run Code Online (Sandbox Code Playgroud)

war*_*iuc 33

研究发现,工作了我一个解决方案在这里.

setuptools==2.0.2我做了:

setuptools.setup(
    ...
    packages=setuptools.find_packages(),
    include_package_data=True,  # use MANIFEST.in during install
    ...
)
Run Code Online (Sandbox Code Playgroud)

  • 太好了!这个功能解决了几乎所有的问题,我很惊讶这是我听说过的第一个地方.我认为这应该是公认的答案,而不是`__init __.py` hack. (7认同)

小智 27

我个人不喜欢setuptools在概念和实现方面混合代码和数据的方式.我认为正是这种实施让你绊倒了.对于setuptools来查找和使用package_data,它需要将数据驻留在python包中.python包可以是目录,但目录中需要有一个__init__.py文件.所以看起来你需要以下(空的很好)文件:

./package_fiddler/data/__init__.py
./package_fiddler/data/stylesheets/__init__.py
Run Code Online (Sandbox Code Playgroud)

  • ``__init __.py``用于将目录作为模块导入 - 这对于数据目录来说不是必需的.请参阅[我的答案](http://stackoverflow.com/a/32635882/1728179). (7认同)
  • 之前我遇到过类似的问题,确实需要__init__.py.http://stackoverflow.com/questions/3760970 (2认同)
  • 我同意.奇怪的是在嵌套数据文件中只需要一个`__init __.py`文件就可以在我的帖子的*edit*部分用`tree2`正确安装项目! (2认同)

Leo*_*Leo 12

在"setup.py"中包含包数据的最简单方法是这样的:

package_data = {'<package name>': ['<path to data file within package dir>']}
Run Code Online (Sandbox Code Playgroud)

所以在你的例子中:

package_data = {'package_fiddler': ['data/*', 'data/stylesheets/*']}
Run Code Online (Sandbox Code Playgroud)

package_data是一个字典,其中键是安装程序中包含的软件包的名称.这些键下的值应该是包目录中特定文件路径或globs /通配符的列表.

您还需要包含标志:

zip_safe=False
Run Code Online (Sandbox Code Playgroud)

setup(...)如果你希望能够解决文件系统路径到您的数据.否则你可以pkg_resources这样做:http://peak.telecommunity.com/DevCenter/PythonEggs#accessing-package-resources

您绝对不需要__init__.py"data"目录中的文件 - 该目录不是模块,也不是要导入的.

  • 是的,这很有效.但是你必须复制`MANIFEST.in`和`setup.py`中的路径并使它们保持同步. (2认同)