有没有办法添加命名空间前缀setuptools包分发?

时间:2011-05-16 14:41:54

标签: python setuptools

我想在我的Python setuptools分布式软件包中添加名称空间前缀。例如。我们有一个名为common_utils的软件包,希望它可以作为umbrella.common_utils访问,而不必在软件包树中包含虚拟目录/模块“umbrella”。

这可能吗?

谢谢,

1 个答案:

答案 0 :(得分:2)

您可以使用package_dir选项告诉setuptools完整的包名和子包的位置:

from setuptools import setup

setup(
    name = 'umbrella',
    packages = [
        'umbrella.common_utils'
        ],
    package_dir = {
        'umbrella.common_utils': './common_utils'
        }
    )

结果:

% python setup.py build
..
creating build/lib/umbrella
creating build/lib/umbrella/common_utils
copying ./common_utils/__init__.py -> build/lib/umbrella/common_utils

<强>更新

正如您所发现的那样,python setup.py develop目标有点像黑客。它将您的项目文件夹添加到site-packages/easy-install.pth,但不会使您的软件包适应setup.py中描述的结构。不幸的是,我还没有找到一个setuptools / distribute-compatible解决方法。

听起来你有效地想要这样的东西,你可以把它包含在项目的根目录中并根据你的需要进行定制:

在项目根目录中创建名为develop的文件:

#!/usr/bin/env python

import os
from distutils import sysconfig

root = os.path.abspath(os.path.dirname(__file__))
pkg = os.path.join(sysconfig.get_python_lib(), 'umbrella')
if not os.path.exists(pkg):
    os.makedirs(pkg)
open(os.path.join(pkg, '__init__.py'), 'wb').write('\n')
for name in ('common_utils',):
    dst = os.path.join(pkg, name)
    if not os.path.exists(dst):
        os.symlink(os.path.join(root, name), dst)


(virt)% chmod 755 ./develop
(virt)% ./develop
(virt)% python -c 'from umbrella import common_utils; print common_utils'
<module 'umbrella.common_utils' from 
   '/home/pat/virt/lib/python2.6/site-packages/umbrella/common_utils/__init__.pyc'>