setuptools
不能按你想的那样做:它会寻找
py_modules
只有在
setup.py
位于。IMHO最简单的方法是将SWIG模块保存在希望它们位于名称空间/目录结构中的位置:rename
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
删除
py_模块
从
安装程序.py
. 这个
"hello"
在
package
列表将使
设置工具
拿起整个包裹,包括
__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中。这也是为什么
设置工具
(和
distutils
)工作原理:dev沙箱的结构应该允许直接从它运行代码,而不需要移动模块。
产生的SWIG
你好,py
以及生成的扩展
_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