[Python学习]setup.py和MANIFEST.in

By limodou

今天把我为 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要方便一些。

::...
免责声明:
当前网页内容, 由 大妈 ZoomQuiet 使用工具: ScrapBook :: Firefox Extension 人工从互联网中收集并分享;
内容版权归原作者所有;
本人对内容的有效性/合法性不承担任何强制性责任.
若有不妥, 欢迎评注提醒:

或是邮件反馈可也:
askdama[AT]googlegroups.com


订阅 substack 体验古早写作:


点击注册~> 获得 100$ 体验券: DigitalOcean Referral Badge

关注公众号, 持续获得相关各种嗯哼:
zoomquiet


自怼圈/年度番新

DU22.4
关于 ~ DebugUself with DAMA ;-)
粤ICP备18025058号-1
公安备案号: 44049002000656 ...::