嵌入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的os模块中的os.walk()函数
os.walk('path')函数对于每个目录返回一个三元组,(dirpath, dirnames, filenames), 第一个是路径,第二个是路径下面的目录,第三个是路径下面的文件 如果加参数t ...
- 嵌入Python | 调用Python模块中有参数的函数
开发环境Python版本:3.6.4 (32-bit)编辑器:Visual Studio CodeC++环境:Visual Studio 2013 需求说明前一篇<在C++中嵌入Python|调 ...
- Python使用functools模块中的partial函数生成偏函数
所谓偏函数即是规定了固定参数的函数,在函数式编程中我们经常可以用到,这里我们就来看一下Python使用functools模块中的partial函数生成偏函数的方法 python 中提供一种用于对函数固 ...
- linux下python调用c模块
在C调用Python模块时需要初始化Python解释器,导入模块等,但Python调用C模块却比较简单,下面还是以helloWorld.c 和 main.py 做一说明: (1)编写C代码,hel ...
- python基础:os模块中关于文件/目录常用的函数使用方法
Python是跨平台的语言,也即是说同样的源代码在不同的操作系统不需要修改就可以同样实现 因此Python的作者就倒腾了OS模块这么一个玩意儿出来,有了OS模块,我们不需要关心什么操作系统下使用什么模 ...
- Python的collections模块中namedtuple结构使用示例
namedtuple顾名思义,就是名字+元组的数据结构,下面就来看一下Python的collections模块中namedtuple结构使用示例 namedtuple 就是命名的 tuple,比较 ...
- Python 调用JS文件中的函数
Python 调用JS文件中的函数 1.安装PyExecJS第三方库 2.导入库:import execjs 3.调用JS文件中的方法 Passwd = execjs.compile(open(r&q ...
- 【转】在Python的struct模块中进行数据格式转换的方法
这篇文章主要介绍了在Python的struct模块中进行数据格式转换的方法,文中还给出了C语言和Python语言的数据类型比较,需要的朋友可以参考下 Python是一门非常简洁的语言,对于数据类型的表 ...
随机推荐
- .NET代码执行效率优化
NET性能优化方面的总结 从2004年底开始接触C#到现在也有2年多的时间了,因为有C++方面的基础,对于C#,我习惯于与C++对比.现在总结一些.NET方面的性能优化方面的经验,算是对这两年多的.N ...
- Fiddler: 如何抓取HTTPS协议的网页
作者:韦玮 转载请注明出处 Fiddler默认只能抓取HTTP协议的网页,不能抓取HTTPS协议的网页,而我们很多时候,都需要抓HTTPS协议的网页,比如抓淘宝数据等.今天,韦玮老师会为大家讲解如何 ...
- @RequestParam接收解析不到 POST 提交的 数据
1.使用postman或者其他发送请求模拟器进行模拟访问,需要指定Headers为Content-Type:application/x-www-form-urlencoded;指定body类型为x-w ...
- HBuilder后台保活开发(后台自动运行,定期记录定位数据)
http://ask.dcloud.net.cn/question/28090 后台自动运行,定期记录定位数据 分类:HTML5+ 各位新年好 小弟以前用hbuilder开发过几个项目,现在有一新 ...
- time&datetime
关于time模块的代码部分 1 #_*_coding:utf-8_*_ 2 __author__ = 'Alex Li' 3 4 import time 5 6 7 # print(time.cloc ...
- 编写高质量java代码151个建议
http://blog.csdn.net/aishangyutian12/article/details/52699938 第一章 Java开发中通用的方法和准则 建议1:不要在常量和变量中出现易混 ...
- jenkins-1
1 下载jenkins,https://jenkins.io/download/, 我在此处用的是war的的形式启动的,配置tomact的server.xml,如果是一个主机多个tomact的话还要编 ...
- Linux运维人员最常用166个命令汇总
引用自“菜鸟博客” 命令 功能说明 线上查询.帮助命令(2个) man 查看命令帮助,命令词典,更复杂还有info,但不常用. help 查看Linux内置命令的帮助,比如cd等命令. 文件.目录操作 ...
- AlexNet实践
注释: CNN使用TF搭建比较简单,就像Hough检测使用CV很简单一样.但是怎么使用CNN去做一些实际操作,或者说怎么使用现有的方法进行慢慢改进,这是一个很大的问题! 直接跟着书本或者视频学习有点膨 ...
- java新手抖机灵(java新手技巧)
java新手抖机灵(java新手技巧) 1.交换两个整数的值 好处是不用定义临时变量,显得代码简洁,提高运行效率 其实也可以用+-*/进行这种运算 比如可以这样: a = a + b; b = a - ...