使用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被示为以下。您可以下载并在计算机上进行实验。
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] 删除。
我来说两句