开发环境
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. linux上静态库和动态库的编译和使用(附外部符号错误浅谈)

    主要参考博客gcc创建和使用静态库和动态库 对于熟悉windows的同学,linux上的静态库.a相当于win的.lib,动态库.so相当于win的.dll. 首先简要地解释下这两种函数库的区别,参考 ...

  2. 多版本opencv管理; find_package()的原理解析

    近期用cmake编译程序时,报错找不到opencv2.由于我电脑里安装了多个版本的opencv,管理不善,借此机会梳理一下思路. 1. Cmake -- find_package(Opencv REQ ...

  3. 20175227张雪莹 2018-2019-2 《Java程序设计》第三周学习总结

    20175227张雪莹 2018-2019-2 <Java程序设计>第三周学习总结 教材学习内容总结 (仅在此列举个性化学习总结) 一.编程语言的几个发展阶段. 1.面向机器语言:汇编语言 ...

  4. ftok()函数深度解析

    [转载] 原文链接:https://blog.csdn.net/u013485792/article/details/50764224 关于ftok函数,先不去了解它的作用来先说说为什么要用它,共享内 ...

  5. 一切为了解决隐私问题,绿洲实验室Ekiden协议介绍

    绿洲实验室官网截图 下一代区块链平台的竞争已经悄然展开,每个月我们都能看到新成立的创业公司宣称,他们要采用区块链解决所有问题.大约80-90%的区块链项目,运行在像Ethereum这样的平台上. 创建 ...

  6. c# 字典

    字典 在System.Collections.Generic下, 对应HashTable,添加了泛型的特性,性能更高跟安全 在内存中是散列排布的,存储也是键值对 Dictionary<键的数据类 ...

  7. mass create DN

    RUN VL10 in the background. http://paperstreetenterprises.com/running-vl10-background/ VL10*开头的TCODE ...

  8. Zookeeper的一致性协议:Zab

        Zookeeper使用了一种称为Zab(Zookeeper Atomic Broadcast)的协议作为其一致性复制的核心,据其作者说这是一种新发算法,其特点是充分考虑了Yahoo的具体情况: ...

  9. android 开发 View _15 导入一张图片将它裁剪成圆形 与 paint图层叠加处理详解

    方法一: /* 实现思维是这样的: 1.首先拿到bitmap图片 2.得到bitmap图片的高度 宽度,并且计算好各个画图尺寸 3.创建一个空白的 bitmap图片: Bitmap output = ...

  10. RF:操作笔记

    1.变量运算