setup.py的sdist,bdist和install在data_files方面表现不同

时间:2014-01-23 10:23:52

标签: python setuptools setup.py data-files

我正在尝试分发网络资产以及我正在尝试打包的网络应用,但我失败了。我不明白为什么在运行bdist,sdist或install时我安装了不同的文件列表或包。

项目布局

该项目在Arch上使用python 3运行。结果与Raspbian上的Py3相同。  我做了一个非常精简的版本,以简化操作,我在这里描述。

文件布局如下:

data/index.html  
MANIFEST.in
mylib.py
setup.py

MANIFEST.in文件是:

recursive-include data *

setup.py是:

#!/usr/bin/env python

from setuptools import setup, find_packages

setup(name='mylib',
      version='0.1.2',
      url='http://www.example.org',
      author='Foo',
      packages=find_packages(),
      data_files = [ ('share/mylib', ['data/index.html']) ]
)

我的目标是在index.html中安装PREFIX/share/mylib/index.html

正在运行setup.py

现在,bdist将文件包含在看似正确的位置,而sdistinstall只是忽略它:

  • bdist

使用bdist,我在结果tar中有以下文件:

./usr/lib/python3.3/site-packages/mylib-0.1.2-py3.3.egg-info/SOURCES.txt
./usr/lib/python3.3/site-packages/mylib-0.1.2-py3.3.egg-info/top_level.txt
./usr/lib/python3.3/site-packages/mylib-0.1.2-py3.3.egg-info/dependency_links.txt
./usr/lib/python3.3/site-packages/mylib-0.1.2-py3.3.egg-info/PKG-INFO
./usr/share/mylib/index.html

这正是我想要安装的,完美的。但是,我真的希望sdistinstall能够工作,因为我想在PyPI上分发这个东西,并且能够从源代码检查中安装。

  • sdist

当我解开sdist文件时,一切似乎都没问题并包含数据:

...
mylib-0.1.2/data/
mylib-0.1.2/data/index.html
...

但是,如果我在解除对象的目录中sudo python setup.py install --record=log.txt,则日志中列出的唯一文件是/usr/lib/python3.3/site-packages/mylib-0.1.2-py3.3.egg。在任何地方都没有data/index.html的痕迹('/ usr / local / share','/ usr / share')

  • 安装

与sdist相同的问题(我想这是预期的)。在任何地方都没有data/index.html的痕迹('/ usr / local / share','/ usr / share')。

我还试图像这样添加一个setup.cfg:

[install]
install-data=/usr/local/share/mylib/
install_data=/usr/local/share/mylib/

(我已经添加了install-data和install_data,因为docs表示使用后者,而我看到其他项目使用前者)。没有运气。

后记

现在,我对python及其环境都很陌生,我可能会遗漏一些明显或误解setuptools如何工作的东西。我一直在阅读文档,在data_files中详细阅读stackoverflow的Q& A,但没有取得任何进展。

如果有人能指出我正确的方向来解决这个问题,那就太好了。链接到分发资产的简单项目也是一个很好的阅读。我找不到一个给我那个“啊啊!”时刻。

感谢阅读。

1 个答案:

答案 0 :(得分:2)

我不知道这是否有帮助,因为我总是包含我的数据文件相对于他们使用的python包。除了MANIFFEST.in之外,package_data还有setup.py个密钥:

setup(name='mylib',
  version='0.1.2',
  url='http://www.example.org',
  author='Foo',
  packages=find_packages(),
  package_data={'package_name': 'package_dir/data/*'}

)

这会将数据放到site-packages/mylib-0.1.2/data