gpt4 book ai didi

python - 使用 distutils,其中 swig 接口(interface)文件位于 src 文件夹中

转载 作者:太空宇宙 更新时间:2023-11-03 11:31:48 25 4
gpt4 key购买 nike

我有一个看起来像这样的 setup.py:

from setuptools import setup, Extension
import glob

sources = glob.glob('src/*.cpp') + glob.glob('src/*.i')
# this is ugly, but otherwise I get the wrapper included twice
sources = [source for source in sources if '_wrap' not in source]
setup(
name = 'engine',
ext_modules = [
Extension(
'_engine',
sources = sources,
swig_opts = ['-c++'],
include_dirs = ['src']
)
],
py_modules = ['engine']
package_dir = {'' : 'src'}
)

现在只要我运行 install 两次就可以了。第一次,swig 在 src 目录中创建 engine.py。但它不会被复制到目标。我第二次运行 setup.py 文件时,找到并安装了 engine.py。有没有一种方法可以一次性完成所有工作?

最佳答案

我同意这应该开箱即用,并且会认为这是一个错误。

实现此功能的一个方法是简单地更改构建内容的顺序。默认情况下,setup.py 将首先收集 python 模块,然后构建任何外部包。

您可以通过子类化默认的 build 类来更改构建顺序,然后让 setup.py 使用您的自定义 build通过 cmdclass 选项进行分类。

from setuptools import setup, Extension
from distutils.command.build import build as _build

#Define custom build order, so that the python interface module
#created by SWIG is staged in build_py.
class build(_build):
# different order: build_ext *before* build_py
sub_commands = [('build_ext', _build.has_ext_modules),
('build_py', _build.has_pure_modules),
('build_clib', _build.has_c_libraries),
('build_scripts', _build.has_scripts),
]

setup(
name = 'engine',
cmdclass = {'build': build }, #Use your own build class
ext_modules = [Extension('_engine',
sources = sources,
swig_opts = ['-c++'],
include_dirs = ['src']
)],
...

关于python - 使用 distutils,其中 swig 接口(interface)文件位于 src 文件夹中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17666018/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com