嵌入Python系列 | 调用Python模块中无参数函数
开发环境
Python版本:3.6.4 (32-bit)
编辑器:Visual Studio Code
C++环境:Visual Studio 2013
需求说明
在用VS2013编写的Win32程序CallPy.exe中,调用Python模块say_hi.py中的prt_hi()函数,从而实现C++中Python的嵌入。
0 准备say_hi.py模块
1 设置主程序CallPy环境
使用VS2013新建一个名为CallPy的Win32空项目,添加主程序文件CallPy.cpp,再按照下图将Python安装目录下的include和libs两个文件夹的完整路径添加到项目中:
然后包含Python头文件,最终的主程序代码如下:
此时编译一下CallPy,会提示类似下图的无法打开文件“python36_d.lib”的错误
这是因为我们当前在Debug下,而Python没有提供Debug版的lib文件,有如下的方法可以解决这一问题:
第1种方法
将Python安装目录下libs中python36.lib复制一份,并将副本改名为python36_d.lib第2种方法
修改Python安装目录下include中的pyconfig.h文件,搜索一下“python36_d.lib”,并将其改为“python36.lib”,让python都使用非Debug版的lib第3种方法
自行编译Python源代码生成python36_d.dll
2 开始嵌入
Step 1
初始化Python解释器进行
Step 2
导入say_hi.py模块
调试时发现pModule依然为NULL,因为在搜索路径中找不到say_hi模块,有两种解决方法:
第1种方法
将say_hi.py放到与CallPy.exe相同的目录下第2种方法
使用PyRun_SimpleString等方法将say_hi.py所在的路径加到搜索路径中
Step 3
获取需要调用的函数prt_hi()
Step 4
调用prt_hi()
调用后运行效果修改say_hi模块中prt_hi函数的实现,而不用重新编译CallPy.exe程序,即可得到不同的输出结果。
Step 5
善后清理工作
3 一些注意事项
- Python模块的名称不能为test
- 注意Python模块的存放位置
- 导入模块时不能加后缀.py
- 需要自行解决缺python36_d.lib的问题
- 使用一致平台,如都使用32位
源代码链接:https://pan.baidu.com/s/1RFRL4M0jB6R7LSXh45DQDQ
嵌入Python系列 | 调用Python模块中无参数函数的更多相关文章
- 嵌入Python | 调用Python模块中无参数的函数
开发环境 Python版本:3.6.4 (32-bit) 编辑器:Visual Studio Code C++环境:Visual Studio 2013 需求说明 在用VS2013编写的Win32程序 ...
- Python:包、模块、类、函数的调用
一.关系 包一般指文件夹或者安装包(安装包一般也是压缩后的文件夹),里面包含多个.py文件(必须有一个__init__.py文件),一般也含有多个子包(或子文件夹): 一般一个.py文件就是一个模块, ...
- python第二十课——math模块中常用的函数
属性: e:自然数 pi:圆周率 函数: ceil():向上取整 floor():向下取整 sqrt():开平方根 radians():角度转弧度 degrees():弧度转角度 import mat ...
- PYTHON练习题 二. 使用random中的randint函数随机生成一个1~100之间的预设整数让用户键盘输入所猜的数。
Python 练习 标签: Python Python练习题 Python知识点 二. 使用random中的randint函数随机生成一个1~100之间的预设整数让用户键盘输入所猜的数,如果大于预设的 ...
- CUDA常见问题之无法在c文件中调用cu文件中定义的函数
当在C源文件中调用cu文件中定义的函数时,会出现undefined reference的问题,而在C++源文件中调用cu文件中定义的函数时则不会出现这个问题. 出现上述问题的原因是,nvcc编译器采用 ...
- Python3:numpy模块中的argsort()函数
Python3:numpy模块中的argsort()函数 argsort函数是Numpy模块中的函数: >>> import numpy >>> help(nu ...
- bytectf2019 boring_code的知识学习&&无参数函数执行&&上海市大学生CTF_boring_code+
参赛感悟 第三次还是第二次参加这种CTF大赛了,感悟和学习也是蛮多的,越发感觉跟大佬的差距明显,但是还是要努力啊,都大三了,也希望出点成绩.比赛中一道WEB都没做出来,唯一有点思路的只有EZCMS,通 ...
- python学习笔记013——模块中的私有属性
1 私有属性的使用方式 在python中,没有类似private之类的关键字来声明私有方法或属性.若要声明其私有属性,语法规则为: 属性前加双下划线,属性后不加(双)下划线,如将属性name私有化,则 ...
- Python系列5之模块
模块 1. 模块的分类 模块,又称构件,是能够单独命名并独立地完成一定功能的程序语句的集合(即程序代码和数据结构的集合体). (1)自定义模块 自己定义的一些可以独立完成某个功能的一段程序语句,可以是 ...
随机推荐
- 8、Preferences
(官网:www.libgdx.cn) Preferences是保存简单数据的一种很好的方式,比如用户设置,游戏状态等.Preferences原理像hash map,使用字符串作为键值,多种类型作为值. ...
- (三十四)NavigationController初步
为了了解底层,首先不基于UIWindow而基于UIWindow来创建App. 由于Xcode6没有以前的基于UIWindow的空项目,所以选择SingleView,然后删除storyboard,移除B ...
- Asp.Net中使用JQueryEasyUI--善良公社项目
jQuery UI 是以 jQuery 为基础的开源 JavaScript 网页用户界面代码库.包含底层用户交互.动画.特效和可更换主题的可视控件.我们可以直接用它来构建具有很好交互性的web应用程序 ...
- Android进阶(十五)socket通信——聊天室
想做一个聊天室,花费了将近一天的时间,各种错误.讲解知识点之前,絮叨几句:动手能力还是很重要的,有时看似简单的一个问题,当你真正着手去解决的时候就有可能会遇到各种各样的问题,原因之一就是因为你的知识储 ...
- 被final关键字坑了
一直都傻傻的以为用final关键字定义的都是不可变的.没想到的是对基本类型来说,这是一直成立的. 但是对于final修饰的对象,仍然可以修改对象里面的对象和成员变量.不变的只是当前对象的地址. 昨天我 ...
- 配置hadoop-1.2.1 eclipse开发环境
写这篇文章的目的是记录解决配置过程中的问题 首先我们先看下这篇博文 配置hadoop-1.2.1 eclipse开发环境 但是在[修改 Hadoop 源码]这里,作者发布的 hadoop-core-1 ...
- Oracle Inventory Management Application Program Interface ( APIs)
In this Document Goal Solution References APPLIES TO: Oracle Inventory Management - Version 12 ...
- mysql_建立索引的优缺点
http://blog.csdn.net/superit401/article/details/51291603 建立索引的优缺点: 为什么要创建索引呢? 这是因为,创建索引可以大大提高系统的性能. ...
- Android实训案例(六)——四大组件之一BroadcastReceiver的基本使用,拨号,短信,SD卡,开机,应用安装卸载监听
Android实训案例(六)--四大组件之一BroadcastReceiver的基本使用,拨号,短信,SD卡,开机,应用安装卸载监听 Android中四大组件的使用时重中之重,我这个阶段也不奢望能把他 ...
- Java-ServletInputStream
import java.io.InputStream; import java.io.IOException; /** * Provides an input stream for reading b ...