Use la herramienta SWIG para empaquetar la biblioteca c / c ++ para python en Windows

SWIG es una herramienta de desarrollo que ayuda al software escrito en C o C ++ a integrarse y conectarse con otros lenguajes de programación de alto nivel .
SWIG se puede aplicar a una variedad de diferentes tipos de lenguajes, incluidos los lenguajes de compilación de scripts de uso común como Perl, PHP, Python, Tcl, Ruby y PHP.
SWIG se usa comúnmente para crear un entorno de ensamblador o análisis de lenguaje de alto nivel, interfaz de usuario, como una herramienta para probar C / C ++ o hacer prototipos.

 

Encontré un pequeño problema en mi trabajo: un programa de cifrado / descifrado se escribió originalmente en C ++, pero luego fue necesario llamarlo en Python. La forma simple y grosera es reescribir una versión Python del programa de acuerdo con el código C ++, pero es muy problemático y también trae los siguientes problemas:

  • Costo de tiempo, algún precio en desarrollo
  • Costo de mantenimiento, debe mantenerlo usted mismo y repetir la rueda
  • Redundancia de código, múltiples conjuntos de códigos, no es fácil de mantener

Más tarde, a través de una introducción de un veterano, aprendí que SWIG se puede usar para encapsular el código C ++ en una biblioteca de Python para que Python lo llame.
SWIG (Simplified Wrapper and Interface Generator) es una herramienta de desarrollo de software que se utiliza para construir interfaces de lenguaje de script para programas C y C ++. SWIG es en realidad un compilador, obtiene declaraciones C / C ++ y las envuelve en un shell para acceder a estas declaraciones en otros lenguajes. Por lo tanto, la mayor ventaja de SWIG es combinar la eficiencia de desarrollo de los lenguajes de scripting con la eficiencia operativa de C / C ++ .

 

Listo para trabajar:

1. 下载 SWIG。https://sourceforge.net/projects/swig/

Agregue SWIG a la variable de entorno para que pueda abrir cmd directamente y usar SWIG directamente, sin cd a cd.

 

1 documento original

Cree una nueva carpeta y coloque su código en ella, de lo contrario, los archivos generados serán desordenados.

Cree estos nuevos archivos, todos están vacíos, simplemente cambie el nombre del sufijo directamente.

contenido del documento:

Zack.cpp (el código C ++ que desea ajustar)

/* File: Zack.c */
 
#include "Zack.h"
 
int fact(int n) {
    if (n < 0) return 0;
    if (n == 0) return 1;
    else return n * fact(n-1);
}

 

Zack.h (el archivo de encabezado de C ++ que desea importar)

int fact(int n);

2 Escriba el archivo de interfaz .i

Estos dos son el contenido de C ++ que desea y debe decirle cómo empaquetarlo con SWIG. Este archivo es Zack.i (cualquier nombre, siempre que termine en .i), de todos modos, debe especificar este archivo cuando utilice el comando SWIG.

/* File: Zack.i */
%module Zack
 
%{
#define SWIG_FILE_WITH_INIT
#include "Zack.h"
%}
 
int fact(int n);

El archivo de interfaz .i contiene principalmente tres partes:

  1. %moduleEl siguiente nombre es el nombre del módulo empaquetado y Python carga el programa a través de este nombre.
  2. %{...%}El contenido agregado en el medio generalmente incluye algunas declaraciones de funciones y archivos de encabezado requeridos por este archivo.
  3. La última parte declara las funciones y variables a encapsular.

Si la parte de la declaración de función que se va a encapsular está escrita en el archivo de encabezado, la última parte se puede incluir directamente %includecon el nombre del archivo de encabezado:

/* File: Zack.i */
%module Zack
 
%{
#define SWIG_FILE_WITH_INIT
#include "Zack.h"
%}
 
%include "Zack.h"

El efecto de los dos archivos .i es el mismo. Se recomienda utilizar el segundo método, que puede simplificar el archivo de interfaz

3 Código del paquete

Luego empaquete en el directorio actual, aparecen dos nuevos archivos, uno .cxx y otro .py, ejecute el siguiente comando:

swig -c++ -python Zack.i

Si es un archivo c, puede ejecutar directamente "swig -python Zack.i".

Una vez completada la ejecución, se generarán dos archivos, Zack.py y Zack_wrap.cxx, lo que equivale a encapsular el archivo cpp original y envolver una capa.

4 Generar biblioteca de enlaces dinámicos

Escriba el archivo setup.py para compilar automáticamente la biblioteca de vínculos dinámicos:

from distutils.core import setup, Extension
 
#生成一个扩展模块(Zack_module )
Zack_module = Extension('_Zack',
                           sources=['Zack_wrap.cxx', #封装后的接口cxx文件
                                    'Zack.cpp'], #以下为原始代码所依赖的文件,源代码从这里引入
                           )
 
setup (name = 'Zack',   #打包后的名称
       version = '0.1',
       author      = "SWIG Docs",
       description = """Zack trial""",
       ext_modules = [Zack_module],  #与上面的扩展模块名称一致
       py_modules = ["Zack"],        #需要打包的模块列表
       )

Después de escribir, ejecute el siguiente comando para compilar:

python setup.py build
Una vez pasada la compilación build/lib.*, puede ver los archivos de la biblioteca de Python compilados en el primer subdirectorio: _Zack.cp37-win_amd64.pyd y Zack.py

En este punto, se puede usar el módulo de Python compilado, copie _Zack.cp37-win_amd64.pyd y Zack.py en su ruta de prueba, escriba test.py, importe Zack en el archivo test.py. .

 

Si desea instalar el módulo en el directorio raíz de Python, puede usar este comando para configurar en la ruta setup.py justo ahora e instalar el módulo Zack en el directorio raíz de Python. (No es necesario ejecutar python setup.py build, simplemente ejecute python setup.py install para compilar e instalar)

La siguiente es mucha información de salida, no importa.

 

Para probarlo, importe Zack en cualquier archivo py.

5 Errores que se pueden encontrar durante la compilación

Cuando ejecuta python setup.py build para compilar en el paso 4, puede encontrar los siguientes errores:

error: no se puede encontrar vcvarsall.bat

Esto se debe a que Python no puede encontrar el compilador integrado de Microsoft. Necesita instalar el compilador Microsoft Visual C ++. Tal vez ya lo haya instalado en su computadora, pero aún informa un error. Esto puede deberse a que la versión que instaló no coincide con la versión requerida por Python. Ir a Microsoft Descargue la herramienta de compilación de Visual Studio 2019 desde el sitio web oficial,

https://visualstudio.microsoft.com/zh-hant/visual-cpp-build-tools/

La descarga y la instalación pueden requerir más de 1 G. Después de la instalación, reinicie la computadora y vuelva a compilar.

Además, los hermanos que usan MinGW-w64 para compilar código c, python3.4 y superior no admiten este método, por lo que no lo recomiendo aquí.

 

 

referencia:

https://blog.csdn.net/Yonggie/article/details/100543900?utm_medium=distribute.pc_relevant_t0. 1.channel_param

Supongo que te gusta

Origin blog.csdn.net/qq_34440409/article/details/108883498
Recomendado
Clasificación