无法从使用 SWIG 创建的 python 访问 C++ 扩展模块及其方法

Posted

技术标签:

【中文标题】无法从使用 SWIG 创建的 python 访问 C++ 扩展模块及其方法【英文标题】:Cannot access C++ extension module and its methods from python created using SWIG 【发布时间】:2018-11-29 05:56:44 【问题描述】:

visual studio 2017 中创建了一个空的 c++ 使用以下 C++ 方法添加了以下文件

//gfg.c

#include <stdio.h> 
#include <math.h> 

//our header file 
#include "gfg.h" 
#define ll long long 

double myvar = 3.4;

// calculate factorial 
ll int fact(ll int n)

    if (n <= 1)
        return 1;
    else
        return (n * fact(n - 1));


//find mod 
int my_mod(int n, int m)

    return(n % m);

//gfg.h

#pragma once

long long int fact(long long int n);
int my_mod(int n, int m);

//gfg.i 用于痛饮

/* file : gfg.i */

/* name of module to use*/
%module gfg 
% 
    /* Every thing in this file is being copied in  
     wrapper file. We include the C header file necessary 
     to compile the interface */
    #include "gfg.h" 

    /* variable declaration*/
    double myvar; 
% 

/* explicitly list functions and variables to be interfaced */
double myvar; 
long long int fact(long long int n1); 
int my_mod(int m, int n); 

/* or if we want to interface all functions then we can simply 
   include header file like this -  
   %include "gfg.h" 
*/

为 gfg.i 文件添加了自定义操作,如下所示,输出文件名为 gfg_wrap.c

$(SWIG_PATH)\swig.exe -python gfg.i

在编译 gfg.i 文件时,它给出了两个输出 gfg.pygfg_wrap.c

然后我创建了Setup.py 文件,内容如下

# File : setup.py 

from distutils.core import setup, Extension 
#name of module 
name  = "gfg"

#version of module 
version = "1.0"

# specify the name of the extension and source files 
# required to compile this 
ext_modules = Extension(name='_gfg',sources=["gfg.i","gfg.c"]) 

setup(name=name, 
      version=version, 
      ext_modules=[ext_modules]) 

#C:\Python37\python_d.exe setup.py build_ext --inplace

自定义操作为

C:\Python37\python_d.exe setup.py build_ext --inplace

这个python目录包含swig.exe

执行此操作后,它在项目目录中生成了一个_gfg_d.cp37-win_amd64.pyd 文件。

当从 CMD 给定 import gfg 时,它显示以下错误。

我试图从gfg.h 访问fact 方法我错过了什么吗?

【问题讨论】:

看起来你已经为 Python 解释器构建了它,它与你实际运行的解释器不同。不过,我不能从所写的内容中看出如何。可能与 python_d.exe 不是您系统的默认 Python 有关。 python37.dll 由 Python 的 Release 版本使用,但您正在尝试使用 Python 的 Debug 版本,它正在寻找 python37_d.dll。对于 Python 3.7 使用 python.exe 运行它,它会工作。 【参考方案1】:

python37.dll 由 Python 的 Release 版本使用,但您正在尝试使用 Python 的 Debug 版本,它正在寻找 python37_d.dll。在 Python 3.7 中使用 python.exe 运行它,它会工作。

如果您想要调试版本,请使用:

setup.py build_ext --debug --inplace

扩展名将是_gfg.cp37-win_amd64.pyd(或其他平台上的一些变体)。对于发布版本,它必须命名为 _gfg.pyd,对于调试版本,它必须命名为 _gfg_d.pyd。我不得不手动重命名它才能让它工作。 我没有找到强制命名的选项:

C:\>copy _gfg.cp37-win_amd64.pyd _gfg_d.pyd
        1 file(s) copied.

C:\>python_d
Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 05:02:23) [MSC v.1914 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import gfg
>>> gfg.fact(5)
120

【讨论】:

以上是关于无法从使用 SWIG 创建的 python 访问 C++ 扩展模块及其方法的主要内容,如果未能解决你的问题,请参考以下文章

SWIG:无法使用双指针访问构造函数

无法确定从 SWIG(不是 ctypes)C 传递给 python 例程的正确参数

无法使用 SWIG 在 Python 中实例化 C++ 类(获取属性错误)

Python 属性和 Swig

使用 SWIG 围绕 C++ 的 Python 包装器。参数类型无法识别

SWIG:将其参数从 c++ 修改为 python 的函数