今天把我为 Dabo
写的setup.py发了出去,得到作者的响应,但他来信说我的脚本在他的环境下用不了,真是很奇怪,因为我是可以用的。于是check
out他的修改,发现他把我写的setup.py放在了dabo目录下,而我测试时是在dabo的父目录下的。他还问我目前在他的环境下dabo没有父目
录,问我是否可以有指定的办法。我试了半天,虽然可以将目录指定为父目录,但在安装时dabo这个目录就不存在了,我没有再细致地跟踪下去。不过我发给他
的脚本并不是要使用setuptools的,而是使用 Python
自带的distuils模块。不过在我试验的过程中我仍然发现了这个脚本的问题。问题就是数据文件不能包括进去。为什么原来没有发现呢?因为在测试时打进
去了呀。仔细看目录,原来有一个MANIFEST文件,它保存了将要打包的所有文件,而这个文件一旦存在,distuils将使用它进行打包。而这个文件
是 SetupTools 生成的,却被我修改的脚本给使用了,结果造成我以为是正确的。在我将其删除之后发现,数据文件的确没有打包进去。 经
过我翻阅手册,我发现数据文件在 setuptools
中可以根据版本管理的记录来很好地取出并打包进去。而在distuils中需要使用MANIFEST.in模板来解决,的确是有些麻烦。好在这个模板文件
就是一些匹配的规则,相对简单。于是经过我修改,现在的setup.py脚本为: from distutils.core import setup import os def find_packages(where='.'): out = [] stack=[('.', '')] while stack: where,prefix = stack.pop(0) for name in os.listdir(where): fn = os.path.join(where,name) if (os.path.isdir(fn) and
os.path.isfile(os.path.join(fn,'__init__.py')) ):
out.append(prefix+name); stack.append((fn,prefix+name+'.')) return out setup( name = "Dabo", version = "0.4", url = 'http://dabodev.com/', author = 'Ed Leafe and Paul McNett', author_email = 'dev@dabodev.com', description = 'Dabo 3-tier Application Framework', license = 'BSD-Like', packages = find_packages(), package_data = { '':['ANNOUNCE', 'AUTHORS', 'ChangeLog', 'INSTALL', 'LICENSE.TXT', 'README', 'TODO'], 'dabo.icons': ['*.png'], 'dabo.lib.reporting':['*.rfxml'], 'dabo.lib.reporting_stefano':['*.rfxml'], 'dabo.ui.uiwx.macImageProblem':['*.png'], 'dabo.ui.uiwx.masked':['README'], }, )
而MANIFEST.in文件为: global-include ANNOUNCE AUTHORS ChangeLog INSTALL LICENSE.TXT README TODO include *.png include *.rfxml prune dabodemo prune daboide prune dist
那
么setup.py在执行时会查找MANIFEST.in文件来动态生成MANIFEST文件。上述为什么要使用global-include呢?因为它
后面的文件并不在当前目录下。而如果改为include,则在测试时报找不到文件错。因此我想这样的处理应该是将这些静态文件放在与setup.py同级
目录下才可以。而我的测试环境不是这样,所以使用了global-include来处理,但这样一来出现什么问题呢?所有在setup.py同级的目录都
将被搜索到,连刚生成的dist目录也不例外,这样就会包括进去许多无用的文件,因此后面又使用了prune命令来将不想处理的目录过滤掉。的确要小心。 正如我前面Blog中所说,在使用setuptools时,如果一个目录没有处于版本控制之下,它是不能找到所有子目录下的数据文件的。但是仍然可以使用MANIFEST.in来解决这个问题。不过还是都加上版权控制为好。 因此为了方便使用setup.py生成源码包我建议目录及文件放置如下: project/ 项目目录用于存放要发布的模块 setup.py README LIENSE ... module/
module是你想要发布的包,它处于一个目录下(project),而project目录处于版本控制之下。所有想打包的数据文件都放到版本控制之中。然后使用setuptools或distutils都可以。当然还是setuptools要方便一些。 |