gpt4 book ai didi

python - setup.py 没有安装 swig 扩展模块

转载 作者:行者123 更新时间:2023-11-28 18:57:32 51 4
gpt4 key购买 nike

我正在努力弄清楚如何在与 swig 共享库相同的级别复制由 swig 生成的包装器。考虑这个树结构:

│   .gitignore
│ setup.py

├───hello
├───src
│ hello.c
│ hello.h
│ hello.i

└───test
test_hello.py

和这个 setup.py:

import os
import sys

from setuptools import setup, find_packages, Extension
from setuptools.command.build_py import build_py as _build_py


class build_py(_build_py):
def run(self):
self.run_command("build_ext")
return super().run()


setup(
name='hello_world',
version='0.1',
cmdclass={'build_py': build_py},
packages=["hello"],
ext_modules=[
Extension(
'hello._hello',
[
'src/hello.i',
'src/hello.c'
],
include_dirs=[
"src",
],
depends=[
'src/hello.h'
],
)
],
py_modules=[
"hello"
],
)

当我执行 pip install . 时,我将在站点包中获取此内容:

>tree /f d:\virtual_envs\py364_32\Lib\site-packages\hello                            
D:\VIRTUAL_ENVS\PY364_32\LIB\SITE-PACKAGES\HELLO
_hello.cp36-win32.pyd


>tree /f d:\virtual_envs\py364_32\Lib\site-packages\hello_world-0.1.dist-info
D:\VIRTUAL_ENVS\PY364_32\LIB\SITE-PACKAGES\HELLO_WORLD-0.1.DIST-INFO
INSTALLER
METADATA
RECORD
top_level.txt
WHEEL

如您所见,hello.py(由 swig 生成的文件)尚未复制到 site-packages 中。

事实是,我已经尝试了以下类似帖子的许多答案:

不幸的是,这个问题仍然没有解决。

问题:如何修复当前的 setup.py,以便将 swig 包装器复制到与 .pyd 文件相同的级别?

最佳答案

setuptools 无法按照您想要的方式执行此操作:它只会在 setup.py 所在的位置查找 py_modules。恕我直言,最简单的方法是将 SWIG 模块保留在命名空间/目录结构中您想要的位置:将 src 重命名为 hello,并添加 hello/__init__.py(可能为空或仅包含 hello.hello 中的所有内容),留下这棵树:

$ tree .
.
├── hello
│   ├── __init__.py
│   ├── _hello.cpython-37m-darwin.so
│   ├── hello.c
│   ├── hello.h
│   ├── hello.i
│   ├── hello.py
│   └── hello_wrap.c
└── setup.py

setup.py 中删除 py_modulespackage 列表中的"hello" 将使setuptools 获取整个包,并包含__init__.py和生成的hello.py:

import os
import sys

from setuptools import setup, find_packages, Extension
from setuptools.command.build_py import build_py as _build_py


class build_py(_build_py):
def run(self):
self.run_command("build_ext")
return super().run()


setup(
name='hello_world',
version='0.1',
cmdclass={'build_py': build_py},
packages = ["hello"],
ext_modules=[
Extension(
'hello._hello',
[
'hello/hello.i',
'hello/hello.c'
],
include_dirs=[
"hello",
],
depends=[
'hello/hello.h'
],
)
],
)

这样,.egg-link包也可以工作(python setup.py develop),因此您可以将正在开发的包链接到 venv 左右.这也是 setuptools(和 distutils)工作方式的原因:开发沙箱的结构应该允许直接从中运行代码,而无需移动模块周围。

SWIG 生成的 hello.py 和生成的扩展 _hello 将位于 hello 下:

>>> from hello import hello, _hello
>>> print(hello)
<module 'hello.hello' from '~/so56562132/hello/hello.py'>
>>> print(_hello)
<module 'hello._hello' from '~/so56562132/hello/_hello.cpython-37m-darwin.so'>

(从扩展文件名可以看出,我现在使用的是 Mac,但在 Windows 下效果完全一样)

此外,除了打包之外,SWIG 手册中还有更多关于 SWIG 和 Python 命名空间和包的有用信息:http://swig.org/Doc4.0/Python.html#Python_nn72

关于python - setup.py 没有安装 swig 扩展模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56562132/

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