当前位置: 首页 > news >正文

Python通过SWIG调用C++时出现的ImportError问题解析

摘要 win10系统,编译器为mingw,按照教程封装C++的一个类并用python调用,一步步进行直到最后一步运行python代码时,在python代码中import example时报错ImportError: DLL load failed while importing _example: The specified module could not be found.本文记录我的解决方法和其它一些解决思路。

先测试C语言

官方文档有完整教程,命令分别为

swig -python example.i
gcc -c -fpic example.c example_wrap.c -I “C:/Users/xd15zhn/AppData/Local/Programs/Python/Python310/include”
gcc -shared example.o example_wrap.o -o _example.pyd -L “C:/Users/xd15zhn/AppData/Local/Programs/Python/Python310/libs” -lpython310

注意包含头文件目录和库目录,具体方法见文末的参考链接。
example.c

#include <stdio.h>
double My_variable = 3.0;
int my_sum(double a, double b) {return(a + b);
}
void my_print() {printf("Hello World!\n");
}

example.i

%module example
%{extern double My_variable;extern int my_sum(int n, int m);extern void my_print();
%}
extern double My_variable;
extern int my_sum(int n, int m);
extern void my_print();

main.py

import example
example.my_print()
print(example.my_sum(1,2))

再测试C++

swig -c++ -python example.i
g++ -c -fPIC example.cpp example_wrap.cxx -I “C:/Users/xd15zhn/AppData/Local/Programs/Python/Python310/include”
g++ -shared example.o example_wrap.o -o _example.pyd -L “C:/Users/xd15zhn/AppData/Local/Programs/Python/Python310/libs” -lpython310

example.cpp

#include <iostream>
#include "example.hpp"
void Example::say_hello() {std::cout << "Hello world!" << std::endl;
}
double Example::my_sum(double a, double b) {return a+b;
}

example.hpp

class Example {
public:void say_hello();double my_sum(double a, double b);
};

example.i

%module example
%{
#include "example.hpp"
%}
%include "example.hpp"

main.py

import example
e = example.Example()
e.say_hello()
print(e.my_sum(1,2))

运行本节开头的3条命令后,不出意外的话,运行3条命令后依次分别生成:

  1. example.py, example_wrap.cxx
  2. example.o example_wrap.o
  3. _example.pyd

问题描述与解决

最后运行main.py后在import example时报错ImportError: DLL load failed while importing _example: The specified module could not be found. stackoverflow上有人提到了这个问题,一个解决方法是

I met exactly the same problem after upgraded python to 3.9 on windows . After struggling for hours, I managed to solve it by manually copying some dlls from ***/mingw/bin/ where mingw32-g++ is found to where my ***.pyd is located. I’m sure that ***/mingw/bin/ has been appended to %PATH%, but don’t know why python3.9 couldn’t find it.

按照这个方法我把/mingw/bin/目录下的所有.dll文件全都复制到当前项目目录下确实解决了问题,但文中说只复制了一部分,想到使用静态编译需要用到两个命令-static-libstdc++-static-libgcc,然后测试了一下确实是只需要这两个文件。除了复制文件这一不太优雅的方法以外,只需要在python代码中加上/mingw/bin/目录即可,完整的python代码如下

import os
os.add_dll_directory('C:/Users/xd15zhn/Documents/mingw64/bin')
import example
e = example.Example()
e.say_hello()
print(e.my_sum(1,2))

但这种方法还是不够优雅,能不能把这两个动态库直接链接到_example.pyd文件里?我尝试在上面第3条命令后加上-llibgcc_s_sjlj-1 -llibstdc++-6,但没有用。不知道有没有更优雅的解决方法。

其它

下面的代码用于单独生成example.cpp的动态库来测试自己写的代码是否有问题。

g++ example.cpp -fpic -shared -o example.dll
g++ main.cpp example.dll -o untitled

参考

SWIG doesn’t work on Windows with MinGW-w64 when binding C++ and Python: DLL load failed while importing: The specified module could not be found -stackoverflow
gcc静态编译之-static-libstdc++、-static-libgcc、-static -简书
g++编译详解 -CSDN博客
gcc&g++链接动态库或静态库方法 -CSDN博客
SWIG:Python调用C++(新手保姆级示范) -知乎
The specified module could not be found的解决办法 -CSDN博客

相关文章:

Python通过SWIG调用C++时出现的ImportError问题解析

摘要 win10系统&#xff0c;编译器为mingw&#xff0c;按照教程封装C的一个类并用python调用&#xff0c;一步步进行直到最后一步运行python代码时&#xff0c;在python代码中import example时报错ImportError: DLL load failed while importing _example: The specified modul…...

3ds Max云渲染有多快,3ds Max云渲染怎么用?

本地渲染效果图和动画3D项目是一个非常耗时的过程&#xff0c;当在场景中使用未优化的几何体或在最终渲染中使用大量多边形模型时&#xff0c;诸如此类的变量最终会增加渲染项目所需的时间和处理器能力。随着提供的渲染服务的云渲染平台出现&#xff0c;越来越多动画师、艺术家…...

Java之线程安全

目录 一.上节回顾 1.Thread类常见的属性 2.Thread类中的方法 二.多线程带来的风险 1.观察线程不安全的现象 三.造成线程不安全现象的原因 1.多个线程修改了同一个共享变量 2.线程是抢占式执行的 3.原子性 4.内存可见性 5.有序性 四.解决线程不安全问题 ---synchroni…...

我有一个方法判断你有没有编程天赋

我有一个方法判断你有没有编程天赋 一 前言 基于知识的诅咒的原理 做一个敲击者很难。问题在于敲击者已拥有的知识&#xff08;歌曲题目&#xff09;让 他们想象不到缺乏这种知识会是什么情形。当他们敲击的时候&#xff0c;他 们不能想象听众听到的是那些独立的敲击声而不是…...

python 生成chart 并以附件形式发送邮件

import requests import json import pandas as pd import numpy as np import matplotlib.pyplot as plt data np.random.randn(5, 3)#生成chart def generate_line_chart(data):df pd.DataFrame(np.abs(data),index[Mon, Tue, Wen, Thir, Fri],columns[A, B, C])df.plot()…...

leetcode-035-搜索插入位置

题目及测试 package pid035; /*35. 搜索插入位置 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。请必须使用时间复杂度为 O(log n) 的算法。示例 1:输入: nums …...

读书笔记--数据治理之法

继续延续上一篇文章&#xff0c;对数据治理之法进行学习。数据治理之法是战术层面的方法&#xff0c;是一套涵盖8项举措的数据治理实施方法论&#xff0c;包括梳理现状与确定目标、能力成熟度评估、治理路线图规划、保障体系建设、技术体系建设、治理策略执行与监控、绩效考核与…...

送了老弟一台 Linux 服务器,它又懵了!

大家好&#xff0c;我是鱼皮。 前两天我学编程的老弟小阿巴过生日&#xff0c;我问他想要什么礼物。 本来以为他会要什么游戏机、Q 币卡、鼠标键盘啥的&#xff0c;结果小阿巴说&#xff1a;我想要一台服务器。 鱼皮听了&#xff0c;不禁称赞道&#xff1a;真是个学编程的好苗…...

CentOS 7(2009) 升级 GCC 版本

1. 前言 CentOS 7 默认安装的 gcc 版本为 4.8&#xff0c;但是很多时候都会需要用到更高版本的 gcc 来编译源码&#xff0c;那么本文将会介绍如何在线升级 CentOS 的 gcc 版本。 2. 升级 GCC (1). 安装 centos-release-scl&#xff1b; [imaginemiraclecentos7 ~]$ sudo yum…...

java非静态代码块和静态代码块介绍

代码块 SE.10.0…02.28 非静态普通代码块&#xff1a;定义在方法内部的代码块&#xff0c;不用任何关键字修饰&#xff0c;又名构造代码块、实例代码块 静态代码块&#xff1a;用static修饰的代码块 非静态代码块 public class Test {public static void main(String[] args…...

Golang中接口类型详解与最佳实践(二)

之前的文章《Golang中的interface(接口)详解与最佳实践》详细介绍了接口类型的定义、使用方法和最佳实践。接口类型使得编写可扩展、可维护和可复用的高质量代码变得更加容易。 如何判断是否实现了某个接口&#xff1f; 还是使用之前文章的例子&#xff0c;例如声明了如下一个…...

ChatGPT 探讨内存屏障的意内存

一、与 ChatGPT 探讨内存屏障的意内存 轻松的氛围&#xff0c;跟 ChatGPT 从内存屏障问题一直扯到CAP原理 我&#xff1a; 2023/4/14 17:48:09 那我可以理解为{ shared_var 1; asm volatile ("sfence" ::: "memory"); asm volatile ("lfence" …...

P1039 [NOIP2003 提高组] 侦探推理

此题难度为&#xff1a;提高/省选- 作者为&#xff1a;CCF_NOI 题目描述 明明同学最近迷上了侦探漫画《柯南》并沉醉于推理游戏之中&#xff0c;于是他召集了一群同学玩推理游戏。游戏的内容是这样的&#xff0c;明明的同学们先商量好由其中的一个人充当罪犯&#xff08;在明…...

模拟电路学习笔记 - 概念与结论

真空二极管&#xff0c;电子管ENIAC发源地&#xff0c;基础方法二极管双极管三极管场向管学习特性&#xff0c;最终运放运方的目的是运用&#xff0c;射频&#xff0c;计算…放大电路大功率元器件和微元器件学习他们的特性分粒 集成设计的角度&#xff0c;不要仅仅分析设计的前…...

Linux驱动开发:I2C子系统

目录 1、I2C简介 1.1 两根线 1.2 信号 1.3 写时序 1.4 读时序 1.5 I2C速率 1.6 I2C驱动框架简介 2、I2C设备驱动 2.1 I2C相关API 2.1.1 i2c_driver 2.1.2 注册&#xff1a;i2c_add_driver 2.1.3 注销&#xff1a;i2c_del_driver 2.1.4 module_i2c_driver&#xff…...

[C++] 动态内存与智能指针

众所周知&#xff0c;C五大内存区&#xff1a;全局数据区(静态区)、代码区、栈区、堆区、常量区。 全局数据区(静态区)&#xff1a;存放全局变量&#xff0c;静态数据和常量&#xff1b; 代码区&#xff1a;存放所有类成员函数和非成员函数代码&#xff0c;函数体的二进制代码。…...

多态的原理

有了虚函数&#xff0c;会在类的对象增加一个指针&#xff0c;该指针就是虚函数表指针_vfptr;虚表本质就是函数指针数组,虚表里面存放着该对象的虚函数的地址&#xff1b; 派生类继承有虚函数基类的对象模型 子类继承父类的虚表指针时&#xff0c;是对父类的虚表指针进行了拷…...

RK3588平台开发系列讲解(内存篇)Linux 伙伴系统数据结构

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、 页二、区三、内存节点沉淀、分享、成长,让自己和他人都能有所收获!😄 📢Linux 系统中,用来管理物理内存页面的伙伴系统,以及负责分配比页更小的内存对象的 SLAB 分配器了。 本篇将介绍伙伴系统相关数据结…...

Windows(MFC/C++)上进程间通讯的几种简单又实用的方法

前段时间&#xff0c;做了一个项目&#xff0c;涉及数据传输。项目实现方式有很多种&#xff0c;但不同的实现方式&#xff0c;对数据的传输方法不同&#xff0c;且各有优缺点。 下文就不同情况来如何选择数据传输(通讯)方式。 先说说需求&#xff0c;模块A获取测试数据&#…...

嘉兴桐乡会计考证培训-备考中级职称有必要报班吗?

备考中级会计职称有必要报班吗&#xff1f;其实&#xff0c;备考报班不能说是必需的&#xff0c;但听课学习确实是节省时间的一种方式&#xff0c;根据同学们的反馈&#xff0c;自学所花费的时间远远多于跟着老师学。上元教育就整理了一些学员报班之前走过的弯路 报班之前 在2…...

Goframe项目实战:从数据库表到API接口的全链路开发指南(含避坑点)

Goframe项目实战&#xff1a;从数据库表到API接口的全链路开发指南&#xff08;含避坑点&#xff09;在当今微服务架构盛行的时代&#xff0c;Go语言因其高性能和并发优势成为后端开发的热门选择。而Goframe作为一款企业级的Go应用开发框架&#xff0c;提供了从数据库操作到API…...

AI大模型应用开发全攻略:从入门到精通,掌握LLM、RAG、Agent核心技能!“

本文全面介绍了AI大模型应用开发的核心技术和实践。从大模型API交互基础&#xff0c;到关键参数Messages和Tools的作用&#xff0c;深入解析了RAG、ReAct、Agent等应用范式。文章还探讨了Fine-tuning微调和Prompt提示词工程的重要性&#xff0c;强调工程实践与业务需求相结合。…...

嘈杂工业场景下的自适应VAD与双码本声纹识别鉴权系统:基于端侧轻量化神经网络与向量量化(VQ)重构

在大型化工车间、能源集控中心以及金融极密隔离库房中&#xff0c;离线声纹识别是物理访问控制和身份安全核验的重要生物特征屏障。然而&#xff0c;在环境本底噪声高达80dB以上的恶劣工业场景下&#xff0c;常规的语音活动检测&#xff08;VAD&#xff09;会频繁误触&#xff…...

钱钟书《围城》第1-5章阅读笔记:一场关于人生困境的提前预演

前言 钱钟书先生的《围城》被誉为"新儒林外史"&#xff0c;是中国现代文学史上风格独特的讽刺经典。这部创作于20世纪40年代的长篇小说&#xff0c;以抗战初期为背景&#xff0c;通过主人公方鸿渐的人生轨迹&#xff0c;深刻揭示了知识分子群体的精神困境与人性弱点。…...

万星easy-vibe:描述需求即发布 零基础无需学语法

开源Easy-Vibe是一套开源AI编程学习方案&#xff0c;把学习顺序从先学语法再做项目翻转为直接做项目。文章拆解了项目驱动、提示词编写、AI编辑器和多Agent协作的完整流程&#xff0c;解释了为什么想法比语法更重要。 github上datawhalechina/easy-vibe&#xff1a;它在GitHub…...

从脚本到系统:设计一个支持插件、限流、重试与监控的 Python 异步爬虫框架

从脚本到系统&#xff1a;设计一个支持插件、限流、重试与监控的 Python 异步爬虫框架 很多人第一次写 Python 爬虫&#xff0c;都是从几十行脚本开始的&#xff1a;requests.get()、BeautifulSoup、for 循环、保存 CSV。它很快&#xff0c;也很有成就感。但真实项目往往不是“…...

022、FFT加速卷积:何时使用?何时不用?

022、FFT加速卷积:何时使用?何时不用? 去年调一个边缘检测模型,在Cortex-M7上跑3x3卷积,帧率死活上不去。同事说“试试FFT加速”,我心想3x3这种小核用FFT不是脱裤子放屁?结果他真改了一版,跑出来比直接卷积还慢三倍。后来查ARM CMSIS-DSP的文档,发现人家明确写了:FF…...

3个关键步骤:从零开始使用AlphaFold 3进行蛋白质结构预测

3个关键步骤&#xff1a;从零开始使用AlphaFold 3进行蛋白质结构预测 【免费下载链接】alphafold3 AlphaFold 3 inference pipeline. 项目地址: https://gitcode.com/gh_mirrors/alp/alphafold3 AlphaFold 3是DeepMind开发的最新蛋白质结构预测工具&#xff0c;它不仅能…...

Java入门全记录

一、表达式 1. 概念 由变量、运算符、字面值组成的式子&#xff0c;运算后会产生一个结果。 两变量参与运算&#xff0c;结果类型规则 如果参与运算的变量有一个为 double 类型&#xff0c;结果就是 double 类型 如果没有 double &#xff0c;有一个为 float 类型&#xff0c;结…...

Python日志框架设计:从基础到高级配置

引言 日志是任何生产级应用不可或缺的组成部分。作为从Python转向Rust的开发者&#xff0c;我深刻理解良好的日志系统对于应用可观测性的重要性。本文将深入探讨Python日志框架的设计原理和最佳实践&#xff0c;帮助你构建高效、可扩展的日志系统。 一、logging模块基础 1.1…...