MANIFEST.in忽略“python setup.py install” – 没有安装数据文件?
这是我的精简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'], )
MANIFEST.in:
include *.txt include whyteboard-help/*.* recursive-include locale *.mo recursive-include images *.png
当我运行“python setup.py install sdist”时,我用“whyteboard-0.41”根文件夹获得了一个不错的.tar.gz文件,里面有我的locale / images /和whyteboard-help /文件夹。 这也有我的whyteboard.py脚本从whyteboard源码包里面启动我的程序。
所以:
whyteboard/ ├── locale/ ├── images ├── whyteboard-help/ ├── whyteboard/ │ ├── __init__.py │ └── other packages etc ├── whyteboard.py ├── README ├── setup.py └── CHANGELOG
这反映了我的计划的来源,是一切应该如何,是正确的。
然而,当我运行“python setup.py install”时,我的数据文件都没有被写入 – 只有“whyteboard”源包和whyteboard.py放在/usr/local/lib/python2.6/dist-packages/ 。
理想情况下,我希望与dist-packages中创build的.tar.gz文件中生成的目录结构相同,因为这是我的程序期望的资源查找方式。
我怎样才能得到“安装”来创build这个目录结构? 据我所知,似乎忽略了我的清单文件。
一些笔记除了奈德的答案(这是核心问题):
Distutils不在site-packages
(或Debian / Ubuntu上的dist-packages
)中的每个项目子目录中安装Python包和模块:它们直接安装到site-packages
,如您所见。 因此,您的sdist中包含的whyteboard-xx
目录将不会以最终安装的forms存在。
其中一个含义是,您应该小心地以一种明确的方式来命名data_files
,因为这些文件/目录直接安装在全局site-packages
目录中,而不是任何包含whyteboard
目录的目录中。
或者你可以改为创buildwhyteboard
包的数据package_data
(这意味着它需要位于该包的内部,即__init__.py
旁边),然后这不是问题。
最后,在py_modules
使用whyteboard.py
模块,在packages
使用whyteboard/__init__.py
软件包没有任何意义。 这两者是相互排斥的,如果两者都有,那么whyteboard.py
模块将被导入忽略,以支持相同名称的包。
如果whyteboard.py
只是一个脚本,并不打算导入,那么你应该使用它的脚本选项,并从py_modules
删除它。
MANIFEST.in
告诉Distutils哪些文件要包含在源码分发中,但是它不会直接影响到安装的文件。 为此,您需要在setup.py
文件中包含相应的文件,一般作为包数据或作为附加文件 。
在Mac OSX上运行python 2.6.1,除了在setup.py中使用data_files参数之外,我完全没有运气。 一切都与MANIFEST.in只是导致文件被包含在dist包,但从来没有安装。 我检查了一些其他的包,他们确实使用data_files来指定其他文件。
我创build了一个简短的函数来帮助枚举目录树中的所有文件
(target_dir,[文件列表]) data_files期望的格式:
def gen_data_files(*dirs): results = [] for src_dir in dirs: for root,dirs,files in os.walk(src_dir): results.append((root, map(lambda f:root + "/" + f, files))) return results
现在我可以在我的设置调用中调用这个:
setup(... data_files = gen_data_files("docs", "lib") ...
那些树中的所有东西都被安装了。
我无法弄清楚为什么我的MANIFEST.in
文件被忽略,当我运行python setup.py install
– 结果是include_package_data=True
解决了这个问题。 package_data
选项实际上不是必需的。
你应该使用setuptools:
#!/usr/bin/env python from setuptools import setup, find_packages from whyteboard.misc import meta setup( name = 'Whyteboard', version = meta.version, packages = find_packages(), include_package_data=True, py_modules = ['whyteboard'], scripts = ['whyteboard.py'], )
这实际上并不使用MANIFEST文件来完成这项工作,但它包含了所有需要的文件。