从distribute迁移到setuptools

0 投票
1 回答
1359 浏览
提问于 2025-04-18 08:39

我正在尝试把一个之前用 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 个回答

2

看起来问题出在setuptools不喜欢被安装到/usr/local/lib/...这个地方。

我强制pip把它安装到了/usr/lib/...,方法是:

sudo pip install --install-option="--prefix=/usr/lib/python2.7/dist-packages" \
  setuptools==3.8

这样之后,setup.py就能顺利安装了。

撰写回答