【问题标题】:setup.py's sdist, bdist and install behaving differently regarding data_filessetup.py 的 sdist、bdist 和 install 在 data_files 方面表现不同
【发布时间】:2014-01-23 10:23:51
【问题描述】:

我正在尝试将 Web 资产与我尝试打包的 Web 应用程序一起分发,但我失败了。我不明白为什么在运行 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']) ]
)

我的目标是在PREFIX/share/mylib/index.html 中安装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 ,因为文档状态使用后者,而我看到其他项目使用前者)。没有运气。

结语

现在,我对 python 和它的环境非常陌生,我可能遗漏了一些明显的东西或误解了 setuptools 的工作原理。我一直在来回阅读文档,在 data_files 中详细阅读了 stackoverflow 的 Q&A,但没有取得任何进展。

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

感谢阅读。

【问题讨论】:

  • 使用zip_safe=False 可以防止egg 文件被压缩,并且在使用python setup.py install 形式时可能会在文件系统中泄露您的文件

标签: python setuptools setup.py data-files


【解决方案1】:

我不知道这是否有帮助,因为我总是将我的数据文件包含在它们附带的 python 包中。除了MANIFFEST.in,您在setup.py 中还有一个package_data 键:

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

【讨论】:

  • 感谢您的回答@knitti,但我真的很想将它们放在 data_files 中,并将它们放在文件系统上的合理位置。
猜你喜欢
  • 1970-01-01
  • 2020-12-22
  • 2020-08-02
  • 1970-01-01
  • 1970-01-01
  • 2011-10-06
  • 1970-01-01
  • 2010-12-09
  • 1970-01-01
相关资源
最近更新 更多