开发环境
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
密码:mffw

嵌入Python | 调用Python模块中无参数的函数的更多相关文章

  1. 嵌入Python系列 | 调用Python模块中无参数函数

    开发环境 Python版本:3.6.4 (32-bit) 编辑器:Visual Studio Code C++环境:Visual Studio 2013 需求说明 在用VS2013编写的Win32程序 ...

  2. python的os模块中的os.walk()函数

    os.walk('path')函数对于每个目录返回一个三元组,(dirpath, dirnames, filenames), 第一个是路径,第二个是路径下面的目录,第三个是路径下面的文件 如果加参数t ...

  3. 嵌入Python | 调用Python模块中有参数的函数

    开发环境Python版本:3.6.4 (32-bit)编辑器:Visual Studio CodeC++环境:Visual Studio 2013 需求说明前一篇<在C++中嵌入Python|调 ...

  4. Python使用functools模块中的partial函数生成偏函数

    所谓偏函数即是规定了固定参数的函数,在函数式编程中我们经常可以用到,这里我们就来看一下Python使用functools模块中的partial函数生成偏函数的方法 python 中提供一种用于对函数固 ...

  5. linux下python调用c模块

    在C调用Python模块时需要初始化Python解释器,导入模块等,但Python调用C模块却比较简单,下面还是以helloWorld.c 和 main.py 做一说明:   (1)编写C代码,hel ...

  6. python基础:os模块中关于文件/目录常用的函数使用方法

    Python是跨平台的语言,也即是说同样的源代码在不同的操作系统不需要修改就可以同样实现 因此Python的作者就倒腾了OS模块这么一个玩意儿出来,有了OS模块,我们不需要关心什么操作系统下使用什么模 ...

  7. Python的collections模块中namedtuple结构使用示例

      namedtuple顾名思义,就是名字+元组的数据结构,下面就来看一下Python的collections模块中namedtuple结构使用示例 namedtuple 就是命名的 tuple,比较 ...

  8. Python 调用JS文件中的函数

    Python 调用JS文件中的函数 1.安装PyExecJS第三方库 2.导入库:import execjs 3.调用JS文件中的方法 Passwd = execjs.compile(open(r&q ...

  9. 【转】在Python的struct模块中进行数据格式转换的方法

    这篇文章主要介绍了在Python的struct模块中进行数据格式转换的方法,文中还给出了C语言和Python语言的数据类型比较,需要的朋友可以参考下 Python是一门非常简洁的语言,对于数据类型的表 ...

随机推荐

  1. gcc centos 新版本的安装方法

    因为centos默认安装的gcc是GCC 4.*.* 是不支持 C++11 的,所以有些新的程序或软件要安装就行要升级GCC,否则无法编译通过 一.如下步骤安装不成功(yum install devt ...

  2. Python变量以及类型

    变量的定义 在程序中,有时我们需要对2个数据进行求和,那么该怎样做呢? 大家类比一下现实生活中,比如去超市买东西,往往咱们需要一个菜篮子,用来进行存储物品,等到所有的物品都购买完成后,在收银台进行结账 ...

  3. 【python】dist-packages和site-packages的区别

    一.dist-packages和site-packages的区别 sudo apt-get install 安装的package存放在/usr/lib/python2./dist-packages目录 ...

  4. ANSI编码导致的乱码

    美帝那边的一个 donet 项目,打开后发现一段string里面各种乱码.一通折腾后发现是编码格式问题.这段string所在的类文件保存格式为ANSI,而不是VS默认的UTF-8. ANSI编码电脑是 ...

  5. Git和代码规范

    最近发现和代码有点问题,总是在上线的紧急关头,和代码浪费了很多的时间,那么总结一下和代码的规范吧. 1.首先我们从master拉取代码进行开发. 2.开发完成之后,把代码上到test上面进行测试,上t ...

  6. 使用Maven

    MyEclipse2015自带有Maven,但是建个工程老出错. (Eclipse J2EE也自带有) 1.下载maven.官网 http://maven.apache.org/download.cg ...

  7. android 开发 View _11_ xml动画

    请大家尊重原创者版权,转载请标明出处:http://blog.csdn.net/harvic880925/article/details/39996643 谢谢! 一.概述 Android的anima ...

  8. 学习excel的使用技巧四显示正常的数字

    记得之前在excel中输入一些数字比如输入手机号 就会变成1.E几类似这种 那么怎样显示正常的数字呢 先选中要操作的输入框 1  找到 数字 这个功能的地方 2 设置为 数值  并且小数点为0 3  ...

  9. RMI(远程方法调用)入门

    这两篇可以入门 http://www.cnblogs.com/ninahan0419/archive/2009/06/25/javarmi.html http://www.cnblogs.com/wx ...

  10. 6. 添加messager.alert()确定按钮的回调函数,即点完确定按钮后触发的事件

    添加messager.alert()确定按钮的回调函数,即点完确定按钮后触发的事件: $.messager.alert('提示信息', "请联系管理员处理!", 'info', f ...