我正在开发一个包含 Cython 扩展的包。
根据https://github.com/pypa/pip/issues/1958 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
)
但我有一种感觉,这个名字setup()
建议只调用一次。像我一样多次调用它是否安全?
我不能只分发轮子,因为该软件包也可供 Linux 用户使用。
[EDIT]
我还认为这个问题比处理编译器依赖关系更普遍。人们可能想要导入一些包(例如sphinx
or pweave
)来预处理包的描述。
我有一个不同的场景,我需要运行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))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)