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文件来完成这项工作,但它包含了所有需要的文件。