代码之家  ›  专栏  ›  技术社区  ›  BPL

setup.py未安装swig扩展模块

  •  0
  • BPL  · 技术社区  · 5 年前

    我正在努力寻找如何在与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 回复  |  直到 5 年前
        1
  •  1
  •   fpbhb    5 年前

    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