首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在单个`setup.py`中多次调用“`setup()”安全吗?

在单个`setup.py`中多次调用“`setup()”安全吗?
EN

Stack Overflow用户
提问于 2017-09-08 13:51:59
回答 2查看 2.4K关注 0票数 8

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

根据https://github.com/pypa/pip/issues/1958,我将使用setup_requires,推迟Cython的进口。我想出的最好的解决方案是在setup()中调用setup.py两次

代码语言:javascript
运行
复制
... # 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
      )

然而,我有一种感觉,setup()的名字意味着它只会被命名一次。像我一样叫几次会安全吗?

我不能只是分发车轮,因为包也将提供给Linux用户。

编辑

此外,我认为这个问题比处理编译器依赖关系更为普遍。一个人可能想进口一些包裹(例如。( sphinxpweave)对其包的描述进行预处理。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-08 15:27:09

简单的答案是:No。调用安装程序后,它将解析命令行参数并开始工作。

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

distutils也不会试图成为编译器,也不会将gcc安装为依赖项。

根据setuptools工具

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

因此,不适用于像Cython这样的软件包。

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

代码语言:javascript
运行
复制
try:
    from Cython.Build import cythonize
except ImportError:
    # Kindly ask the user to install Cython

下列员额可能会有所帮助:

票数 4
EN

Stack Overflow用户

发布于 2018-05-22 12:41:15

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

代码语言:javascript
运行
复制
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))
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46118102

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档