这是我删除的非代码内容的精简版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"时,我得到一个很好的.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
这反映了我的程序的来源,一切应该是怎样的,并且是正确的.
但是,当我运行"python setup.py install"时,我的数据文件都没有写入 - 只有"whyteboard"源包,而whyteboard.py放在/usr/local/lib/python2.6/dist-packages/中.
理想情况下,我希望在.tar.gz文件中生成的目录结构与在dist-packages中创建的目录结构相同,因为这是我的程序期望查找其资源的方式.
如何通过"安装"来创建此目录结构?据我所知,似乎忽略了我的清单文件.
MANIFEST.in
告诉Distutils在源代码发布中包含哪些文件,但它不会直接影响安装的文件.为此,您需要在文件中包含相应的setup.py
文件,通常作为包数据或附加文件.
除了Ned的答案(其中涉及核心问题)之外的一些注释:
Distutils不会在site-packages
(或dist-packages
Debian/Ubuntu)中的每个项目子目录中安装Python包和模块:site-packages
正如您所见,它们直接安装在其中.因此,whyteboard-xx
sdist中的包含目录将不会存在于最终安装的表单中.
这样做的一个含义是,您应该小心地data_files
以一种澄清它们属于哪个项目的方式命名,因为这些文件/目录直接安装在全局site-packages
目录中,而不是安装在任何包含whyteboard
目录中.
或者你可以反而让你的数据package_data
中的whyteboard
包(这意味着它需要住那个包里面,也就是旁边__init__.py
),然后这不是一个问题.
最后,同时包含whyteboard.py
模块py_modules
和whyteboard/__init__.py
包中没有多大意义packages
.这两者是互斥的,如果你同时使用这两个whyteboard.py
模块,那么导入将忽略模块,而使用相同名称的包.
如果whyteboard.py
只是一个脚本,并且不打算导入,那么您应该使用脚本选项,并从中删除它py_modules
.
MANIFEST.in
当我跑步时,我无法弄清楚为什么我的文件被忽略了python setup.py install
- 结果include_package_data=True
解决了这个问题.package_data
实际上并不需要该选项.
在Mac OSX上运行python 2.6.1,除了在setup.py中使用data_files参数外,我绝对没有运气.使用MANIFEST.in的所有内容只会导致文件包含在dist包中,但从未安装过.我检查了一些其他软件包,他们确实使用data_files来指定其他文件.
我创建了一个简短的函数来帮助枚举目录树中的所有文件
data_files期望的(target_dir,[file list])格式:
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") ...
这些树中的所有东西都安装好了.
你应该使用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文件来完成这项工作,但它包含了所有需要的文件.