在单个`setup.py`中多次调用`setup()`是否安全?

abu*_*kaj 5 python distutils setuptools python-2.7 python-3.x

我正在开发一个包含Cython扩展的软件包。

根据https://github.com/pypa/pip/issues/1958,我将使用setup_requires并推迟的导入Cython。我想出的最好的解决方案是致电setup()两次setup.py

... # initial imports
setup(setup_requires=['cython'])
from Cython.Build import cythonize
bar = Extension('foo.bar', sources = ['bar.pyx'])
setup(name = 'foo',
      ... # parameters
      ext_modules = cythonize([bar]),
      ... # more parameters
      )
Run Code Online (Sandbox Code Playgroud)

但是我有一种感觉,setup()建议的名称只能被调用一次。像我一样多次叫它安全吗?

我不能只分发轮子,因为该软件包也将对Linux用户可用。

[编辑]

我也认为这个问题比处理编译器依赖性更为笼统。可能需要导入一些软件包(例如sphinxpweave)来预处理一个软件包的描述。

Dav*_*kac 8

我有一个不同的场景,我需要setup()多次运行:在我的情况下,我正在从相同的来源构建两个包。第一个包是基于 的命令行工具Fabric,第二个包只是库(API、工具等)。对于这么小的项目,将项目拆分为两个存储库似乎太不切实际了,因为 CLI 部分实际上只是一个包装器。setup()使用不同的参数多次运行会导致构建因各种错误(主要是丢失文件)而崩溃。我的解决方案是以setup()不同的方式运行每个Process

from setuptools import setup, find_packages
from multiprocessing import Process

if __name__ == '__main__':
    setups = [
        {
            'name': 'cli-tool',
            'description': 'Some description...',
            'packages': find_packages(),
            'entry_points': {
                'console_scripts': [
                    'cli-tool = fabfile:main'
                ]
            },
            '...': 'etc. needed for setup() ...'
        },
        {
            'name': 'cli-tool-lib',
            'packages': find_packages(exclude=('fabfile',)),
            '...': 'etc.'
        }
    ]

    for s in setups:
        name = s['name']
        print("Building '{}'.".format(name))
        p = Process(target=setup, kwargs=s)
        p.start()
        p.join()
        print("Building of '{}' done.\n".format(name))
Run Code Online (Sandbox Code Playgroud)


gdl*_*lmx 4

简单回答是。一旦您调用安装程序,它将解析命令行参数并开始执行其工作。

至于Cython依赖性,setup_requires这里无能为力。它可能会尝试下载Cython而不安装。正如 SpotlightKid 评论的那样:

distutils 不会尝试成为编译器或安装 gcc 作为依赖项

根据设置工具

如果您使用 distutils 扩展,则需要此参数 (setup_requires),

因此,不适用于像Cython.

我认为用户有责任Cython在调用之前安装setup.py。如果你想提供更友好的错误消息,请尝试使用

try:
    from Cython.Build import cythonize
except ImportError:
    # Kindly ask the user to install Cython
Run Code Online (Sandbox Code Playgroud)

以下帖子可能会有所帮助: