setup.py未安装swig扩展模块

时间:2019-06-12 12:22:09

标签: python swig setuptools distutils

我正在努力找出如何在与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文件相同的级别?

1 个答案:

答案 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_modulessetup.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