2
我在爲我的Python setuptools分佈式軟件包添加一個名稱空間前綴。例如。我們有一個名爲common_utils的包,並且希望它以umbrella.common_utils的形式訪問,而不必在包樹中包含虛擬目錄/模塊'傘'。有沒有辦法添加名稱空間前綴setuptools包發行版?
這可能嗎?
感謝,
我在爲我的Python setuptools分佈式軟件包添加一個名稱空間前綴。例如。我們有一個名爲common_utils的包,並且希望它以umbrella.common_utils的形式訪問,而不必在包樹中包含虛擬目錄/模塊'傘'。有沒有辦法添加名稱空間前綴setuptools包發行版?
這可能嗎?
感謝,
可以使用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 /分發兼容的解決方法。
這聽起來像你有效地希望這樣的事情,你可以在項目中包含的根,根據需要自定義:
在項目中創建的根命名爲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'>
大,我可以看到這與「python setup.py build」一起工作,但是當我執行「python setup.py develop」時,我無法「導入umbrella.common_utils」,這裏發生了什麼? – JimmyK 2011-05-16 15:05:44
是的,'develop'目標有一些限制 - 它要求你的源代碼包匹配預期的安裝結構。我添加了一個快速腳本,您可以利用它來解決此問題。希望能幫助到你。 – samplebias 2011-05-16 15:38:53
所有考慮,只需在源項目中添加「傘」級別會更簡單。 – samplebias 2011-05-16 16:16:04