如何编写setup.py来安装SWIG构建的python扩展(xxx.so文件)?

霍巴特

使用SWIG来构建python扩展(xxx.so)比distutils容易您无需编写wrap.c程序即可包装原始的c程序。所以我想使用SWIG而不是Distutils。但是没有方法可以通过编写setup.py文件来自动安装扩展名(xxx.so)。这困扰了我很多天。

为了更清楚地解释这个问题,我使用“逐步”策略将其弄清楚。

步骤1:有一个原始的C / C ++代码。然后使用SWIG创建Python包装器。

步骤2:使用Distuils(编写setup.py)或仅使用gcc命令行创建Python扩展文件。Python扩展名是xxx.so。显然,在此步骤中,您可以使用Distuils将编译和安装结合在一起。

步骤3:通过编写setup.py安装xxx.so Python扩展。

我只是不知道STEP 3如何编写setup.py以安装xxx.so Python扩展。

有什么方法可以通过编写setup.py而不使用sys.path.append()或sys.path.insert()方法来安装python扩展(xxx.so)?

非常感谢您提供的任何答案!

最后,我尝试了将编译和安装结合在一起的STEP 2方法。它可以正常工作,但是使用setup.py仅安装_xxx.so Python扩展并不是我的目的。

目录结构:

setup.py
src/
    libdemo/
        __init__.py
        LibHello.py
lib/
    palindrome.c   # original C code
    palindrome_wrap.c  # Python wrapper built by SWIG

setup.py代码:

#-*- coding:utf-8 -*-
import sys
import os
from setuptools import setup, find_packages, Extension

libPath = "lib"

moduleLibPalindrome = Extension(
      name = 'libdemo._palindrome', 
      sources = [os.path.join(libPath, 'palindrome_wrap.c'), 
            os.path.join(libPath, 'palindrome.c')]
)
setup (
      name = 'test_example',
      version = '0.1',
      author = "Hobart",
      description = "Install extension from original C/C++",
      packages= find_packages(where = 'src'),
      package_dir = {'':'src'},
      ext_modules=[moduleLibPalindrome]
)

结果检查:

>>> from libdemo import _palindrome
>>> dir(_palindrome)
['SWIG_PyInstanceMethod_New', '__builtins__', '__doc__', '__file__',      '__name__', '__package__', 'is_palindrome']
>>> _palindrome.is_palindrome('asddsa')
1
>>> 

C代码源文件和文件_palindrome.so被示为以下您可以下载并在计算机上进行实验。

m7thon

Distutils与编写扩展无关,而与编译和安装扩展有关。痛饮可以帮助你创建你的C / C ++代码的Python包装,但并没有办理编译和安装。

因此,distutils可以(并且应该)用于安装SWIG生成的扩展。有关使用distutils的信息,请参阅SWIG文档

编辑:我对您正在尝试做的事情有点困惑。通常,您将使用distutils来编译安装扩展。仍然可以通过调用两个单独的步骤来完成此操作

python setup.py build_ext
python setup.py install

但是,如果我正确理解了您,则无论出于何种原因,您都已预编译了扩展名(即xxx.py和_xxx.so),并希望仅使用distutils进行安装。

您可以将package_data关键字用于distutils,即以下setup.py:

from distutils.core import setup
setup (name = 'xxx',
       version = '0.1',
       author = "Nobody",
       description = """Install precompiled extension""",
       py_modules = ["xxx"],
       packages=[''],
       package_data={'': ['_xxx.so']},
       )

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在python setup.py中,如何允许用户无需先进行构建即可安装模块的文件?

如何从单个setup.py构建多个wheel文件?

如何编写嵌套的 __init__.py 文件

如何使“ python setup.py install”安装源而不是egg文件?

如何正确运行setup.py文件?

如何通过需求文件来安装模块?

如何使用setup.py中的自定义PyPI编写Python包?

python setup.py构建忽略一些文件

如何为不同的构建版本打包不同的* .so文件?

如何在构建期间从.so文件中删除符号

如何编写setup.py以包含git repo作为依赖项

如何编写setup.py以包含Git存储库作为依赖项

如何编写setup.py以包括特定的git repo作为依赖项

如何删除.exe文件中以python编写的.exe文件?

如何通过 python setup.py develop 找到 python 模型安装的 .egg-link 文件,当它不在通常的位置时?

Javascript - 编写 js 插件时如何构建最小文件

如何编写良好/正确的__init__.py包文件

如何安装和使用PNGwriter编写PNG图像文件?

如何在不使用setup.py文件的情况下构建源分发?

如何获取libncursesw.so.6文件?安装为“最新”,但文件不存在

如何从文件中编写和读取Python var

如何在python中读取用pkzip编写的zip文件?

Python如何使用熊猫编写新的CSV文件

如何在python中编写多通道wav文件

如何使用python从头开始编写Midi文件

如何编写python脚本以读取文件并返回版本

如何在 HTML 文件中编写 Python for 循环?

如何在python的for循环中正确编写CSV文件?

如何编写上传大于 RAM 的文件的 Python 代码?