从distribute迁移到setuptools
我正在尝试把一个之前用 distribute 安装得很好的项目,转到一个基于 setuptools 的新安装程序上。但不知为什么,我根本无法让 setuptools 正常运行。当我运行我的 setup.py 文件时,distutils 会报错,提示有不支持的选项,而这些选项都是 setuptools 提供的扩展选项。我搞不清楚为什么 setuptools 没有正确处理这些问题。这是在一个运行 Python 2.7 的 Debian Wheezy 系统上。
我创建了一个简单的测试案例来演示这个问题。它是一个独立的脚本,我想把它作为一个工具安装,并且有一个可执行的包装脚本:
foo.py
#!/usr/bin/python
def main():
print 'Foo main() ran'
if __name__ == '__main__':
main()
setup.py
from setuptools import setup
setup(name='foo',
version='1.0',
py_modules = ['foo'],
entry_points = {
'console_scripts': ['foo = foo:main'] # setuptools extension
},
include_package_data = True # another setuptools extension
)
在 Debian 的软件包库中,setuptools 的版本是 0.6.24,这个版本在与 distribute 合并之前。我更希望使用一些保留 distribute 特性的版本。我一直在用 pip 安装不同版本的 setuptools。最新的 4.0.1 安装不成功,但从 1.4 到 3.8 的大部分版本都能正常工作:
$ sudo pip install setuptools==3.8
...
$ python
Python 2.7.3 (default, Mar 13 2014, 11:03:55)
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from setuptools import version
>>> version.__version__
'3.8'
setuptools 的包/蛋被放在 /usr/local/lib/python2.7/dist-packages
里,这在使用 pip 的 Debian 系统上是正常的。
当我尝试用我的 setup.py 安装时,出现了以下错误:
$ sudo python setup.py install
/usr/lib/python2.7/distutils/dist.py:267:
UserWarning: Unknown distribution option: 'entry_points'
warnings.warn(msg)
/usr/lib/python2.7/distutils/dist.py:267:
UserWarning: Unknown distribution option: 'include_package_data'
warnings.warn(msg)
running install
running build
running build_py
running install_lib
running install_egg_info
Removing /usr/local/lib/python2.7/dist-packages/foo-1.0.egg-info
Writing /usr/local/lib/python2.7/dist-packages/foo-1.0.egg-info
Distutils 将 foo.py 安装到 /usr/local/lib/python2.7/dist-packages/
,但显然 setuptools 生成的包装脚本缺失。我本以为 setuptools 会通过子类化或其他方式来处理 distutils 不支持的内容。
我记得多年前 setuptools 就很难用,这也是我选择使用 distribute 的原因。现在它还是不“好用”,让我很失望。我是不是漏掉了什么明显的东西?我怀疑这可能与 Debian 使用 dist-packages
目录而不是 site-packages
有关,但这在使用 distribute 时从来没有问题。
1 个回答
看起来问题出在setuptools不喜欢被安装到/usr/local/lib/...
这个地方。
我强制pip把它安装到了/usr/lib/...
,方法是:
sudo pip install --install-option="--prefix=/usr/lib/python2.7/dist-packages" \
setuptools==3.8
这样之后,setup.py就能顺利安装了。