问题描述
我正在尝试将 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 将文件包含在看似正确的位置,而 sdist 和 install 则忽略它:
- 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
这正是我想要安装的,完美.但是,我真的希望 sdist 和 install 能够工作,因为我想在 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,但没有取得任何进展.
如果有人能指出我解决这个问题的正确方向,那就太好了.一个简单的项目分发资产的链接也将是一个很好的阅读.我只是找不到一个给我"啊啊!"的声音.时刻.
感谢阅读.
推荐答案
我不知道这是否有帮助,因为我总是将我的数据文件包含在它们附带的 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