使用setuptools/distribute时,我无法让安装程序提取任何package_data文件.我读过的所有内容都表明以下是正确的方法.有人可以建议吗?
setup(
name='myapp',
packages=find_packages(),
package_data={
'myapp': ['data/*.txt'],
},
include_package_data=True,
zip_safe=False,
install_requires=['distribute'],
)
Run Code Online (Sandbox Code Playgroud)
myapp/data/数据文件的位置在哪里.
这是我删除的非代码内容的精简版setup.py脚本:
#!/usr/bin/env python
from distutils.core import setup
from whyteboard.misc import meta
setup(
name = 'Whyteboard',
version = meta.version,
packages = ['whyteboard', 'whyteboard.gui', 'whyteboard.lib', 'whyteboard.lib.pubsub',
'whyteboard.lib.pubsub.core', 'whyteboard.lib.pubsub.utils', 'whyteboard.misc'],
py_modules = ['whyteboard'],
scripts = ['whyteboard.py'],
)
Run Code Online (Sandbox Code Playgroud)
MANIFEST.in:
include *.txt
include whyteboard-help/*.*
recursive-include locale *.mo
recursive-include images *.png
Run Code Online (Sandbox Code Playgroud)
当我运行"python setup.py install sdist"时,我得到一个很好的.tar.gz,带有"whyteboard-0.41"根文件夹,里面有我的locale/images /和whyteboard-help/folders.这也有我的whyteboard.py脚本,它从whyteboard源包中启动我的程序.
所以:
whyteboard/
??? locale/
??? images
??? whyteboard-help/
??? whyteboard/
? ??? __init__.py
? ??? other packages etc
??? whyteboard.py
??? README
??? setup.py
??? CHANGELOG
Run Code Online (Sandbox Code Playgroud)
这反映了我的程序的来源,一切应该是怎样的,并且是正确的.
但是,当我运行"python setup.py install"时,我的数据文件都没有写入 …
如何控制车轮中包含哪些文件?它似乎MANIFEST.in没有被使用python setup.py bdist_wheel.
更新:
从源tarball到wheel安装之间的区别我错了.源代码分发包括指定的文件MANIFEST.in,但安装的软件包只有python文件.需要步骤来识别应安装的其他文件,无论安装是通过源分发,egg还是wheel.也就是说,其他包文件需要package_data,而命令行脚本或系统配置文件需要包外的文件的data_files.
我有一个项目,我一直python setup.py sdist用来构建我的包,MANIFEST.in控制包含和排除的文件,以及pyroma和check-manifest来确认我的设置.
我最近将它转换为双Python 2/3代码,并添加了一个setup.cfg
[bdist_wheel]
universal = 1
Run Code Online (Sandbox Code Playgroud)
我可以用python setup.py bdist_wheel它来制造一个轮子,它看起来像是一个万向轮.但是,它不包括指定的所有文件MANIFEST.in.
我挖得更深,现在更了解包装和轮子.这是我学到的东西:
我将两个包文件上传到PyPi上的multigtfs项目:
multigtfs-0.4.2.tar.gz- 源tar球,包括所有文件MANIFEST.in.multigtfs-0.4.2-py2.py3-none-any.whl - 有问题的二进制分布.我创建了两个新的虚拟环境,都使用Python 2.7.5,并安装了每个包(pip install multigtfs-0.4.2.tar.gz).这两种环境几乎完全相同.它们有不同的.pyc文件,即"已编译"的Python文件.有记录磁盘上不同路径的日志文件.源tar球multigtfs-0.4.2-py27.egg-info的安装包括一个文件夹,详细说明安装,并且wheel安装有一个multigtfs-0.4.2.dist-info文件夹,其中包含该进程的详细信息.但是,从使用multigtfs项目的代码的角度来看,两种安装方法之间没有区别.
显然,我的测试使用的.zip文件都没有,因此测试套件将失败:
$ django-admin startproject demo
$ cd demo
$ pip …Run Code Online (Sandbox Code Playgroud) 我有一个python具有固定布局的应用程序,我无法更改.我想用setuptools把它包起来,比如写一个setup.py脚本.
使用官方文档,我能够编写第一个模板.但是,有问题的应用程序使用了许多未明确包含任何包的其他数据文件.这是一个示例源树:
somepackage
__init__.py
something.py
data.txt
additionalstuff
moredata.txt
INFO.txt
Run Code Online (Sandbox Code Playgroud)
这是麻烦:代码something.py 读取文件moredata.txt和INFO.txt.对于前者,我可以通过添加一个空additionalstuff/__init__.py文件来提升additionalstuff一个包并让它被选中来解决这个问题setuptools.但我怎么可能加入INFO.txt我的.egg?
提出的解决方案使用了类似的东西
package_data = { '' : ['moredata.txt','INFO.txt']}
Run Code Online (Sandbox Code Playgroud)
不为我工作,因为文件moredata和INFO.txt不属于一个包,而是单独的文件夹,这只是模块作为一个整体的一部分,而不是任何个人软件包的一部分.如上所述,这可以moredata.txt通过添加__init__.py文件来修复additionpythonalstuff,从而将其提升到包.但是,这不是一个优雅的解决方案,并且根本不起作用INFO.txt,它位于顶级目录中.
根据接受的答案,这是解决方案
这是setup.py:
from setuptools import setup, find_packages
setup(
name='mytest',
version='1.0.0',
description='A sample Python project',
author='Test',
zip_safe=False,
author_email='test@test.com',
keywords='test',
packages=find_packages(),
package_data={'': ['INFO.txt', 'moredata.txt'],
'somepackage':['data.txt']},
data_files=[('.',['INFO.txt']),
('additionalstuff',['additionalstuff/moredata.txt'])],
include_package_data=True, …Run Code Online (Sandbox Code Playgroud) 这将是一个简短的问题.
来源是:https://github.com/exhuma/grc
标题解释了我的问题;)
我注册并上传了包pypi.现在,如果我跑easy_install grc,它按预期工作.但如果我运行pip install grc,它安装正确,但不安装data_files.我不明白为什么会这样.有任何想法吗?
python ×5
pip ×2
setuptools ×2
build ×1
distribute ×1
distutils ×1
easy-install ×1
install ×1
python-wheel ×1
setup.py ×1