我正在努力找出如何在与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文件相同的级别?
答案 0 :(得分:0)
setuptools
不能按照您想要的方式进行:它只会在py_modules
所在的位置寻找setup.py
。 IMHO最简单的方法是将SWIG模块保留在名称空间/目录结构中所需的位置:将src
重命名为hello
,然后添加hello/__init__.py
(可以为空,也可以仅包含{ {1}}),让您拥有这棵树:
hello.hello
从$ tree .
.
├── hello
│ ├── __init__.py
│ ├── _hello.cpython-37m-darwin.so
│ ├── hello.c
│ ├── hello.h
│ ├── hello.i
│ ├── hello.py
│ └── hello_wrap.c
└── setup.py
中删除py_modules
。 setup.py
列表中的"hello"
将使package
拾取整个程序包,并包括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
),因此您可以将正在开发的软件包链接到venv左右。这也是python setup.py develop
(和setuptools
)工作方式的原因:开发人员沙箱的结构应允许直接从中运行代码,而无需移动模块。
然后,由SWIG生成的distutils
和生成的扩展名hello.py
将位于_hello
下:
hello
(从扩展名中可以看到,我现在在Mac上,但这在Windows下完全相同)
除了打包外,SWIG手册中还有关于SWIG和Python名称空间和包的更多有用信息:http://swig.org/Doc4.0/Python.html#Python_nn72