今天想做一个简单的管理密码的小程序,由于最近了解了下Python,就想用Python来写。但是看了看Python的界面库用法有感觉有点麻烦,所以还不如直接使用MFC写写界面,关于csv的文件处理部分使用Python来做,这样可能会简单些。

版本

vs使用2013版本

python使用3.6

notepad++配置python环境

https://www.cnblogs.com/huangsitao/p/10323198.html

VS中配置Python环境

1.在C++中调用Python需要包含“Python.h”头文件,通过everything搜索找到"Python.h",默认路径为C:\Users\Administrator\AppData\Local\Programs\Python\Python36-32\include

2.找到lib文件,我的是Python36.lib,默认路径为C:\Users\Administrator\AppData\Local\Programs\Python\Python36-32\libs

3.将include目录和libs目录拷贝一份保存到sln同级目录(因为在这个解决方案中我要写C++调用Python的程序)

4.在vs中对应的工程上右键->属性,C/C++->常规->附加包含目录填写include路径,链接器->常规->附加库目录填写lib路径,链接器->输入->附加依赖项填写python36.lib

5.main.cpp中编写下面代码,编译没有问题说明配置成功

1 #include<Python.h>
2 intmain()3 {4      return 0;5 }

开始写代码

初始化

Py_Initialize(); //载入Python的内建模块并添加系统路径到模块搜索路径中。无返回值

检查是否初始化成功

Py_IsInitialized();

添加当前路径到系统路径中

PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('./')");

PyRun_SimpleString为执行Python语句的函数。

加载python脚本文件

首先要写好pytest.py文件放到exe同级目录下。

pMoudle为NULL说明加载失败,失败的可能原因有:

1.找不到pytest.py文件,可能未将pytest.py文件拷贝到exe同级目录或者为设置当前路径为系统路径

2.pytest.py脚本有语法错误(我的就是这种原因,2.0和3.0的python语法不同,直接将别人的pytest代码拷贝过来未检查导致失败)

PyObject* pModule = PyImport_ImportModule("pytest");

获取到函数

PyObject* func = PyObject_GetAttrString(pModule, "add");

检查函数是否获取成功

if (!PyCallable_Check(func))
{std::cout<< "not find add function." <<std::endl;return -1;
}

设置调用函数的参数

调用Python函数,参数和返回值都必须为元组

PyObject* args = PyTuple_New(2);
PyObject* arg1 = PyLong_FromLong(4);
PyObject* arg2 = PyLong_FromLong(3);
PyTuple_SetItem(args,0, arg1);
PyTuple_SetItem(args,1, arg2);

调用函数

PyObject* pValue = PyObject_CallObject(func, args);

输出返回值

if (pValue !=NULL)
{printf("Result of call: %ld\n", PyLong_AsLong(pValue));Py_DECREF(pValue);
}

释放资源

Py_Finalize();

完整代码

1 #include<iostream>
2 #include<Python.h>
3
4 intmain()5 {6 Py_Initialize();7     //检查初始化是否成功
8     if (!Py_IsInitialized()) {9         return -1;10 }11     //添加当前路径,可以避免导入模块输入全路径
12     PyRun_SimpleString("import sys");13     PyRun_SimpleString("print ('---import sys---')");14     PyRun_SimpleString("sys.path.append('./')");15     //载入名为pytest的脚本
16     PyObject* pModule = PyImport_ImportModule("pytest");17     if (!pModule) //加载模块失败
18 {19         std::cout << "[ERROR] Python get module failed." <<std::endl;20         system("pause");21         return 0;22 }23     std::cout << "[INFO] Python get module succeed." <<std::endl;24
25     PyObject* func = PyObject_GetAttrString(pModule, "add");26     if (!PyCallable_Check(func))27 {28         std::cout << "not find add function." <<std::endl;29         system("pause");30         return -1;31 }32     PyObject* args = PyTuple_New(2);33     PyObject* arg1 = PyLong_FromLong(4);34     PyObject* arg2 = PyLong_FromLong(3);35     PyTuple_SetItem(args, 0, arg1);36     PyTuple_SetItem(args, 1, arg2);37     PyObject* pValue =PyObject_CallObject(func, args);38     if (pValue !=NULL)39 {40         printf("Result of call: %ld\n", PyLong_AsLong(pValue));41 Py_DECREF(pValue);42 }43     else
44 {45 Py_DECREF(func);46 Py_DECREF(pModule);47 PyErr_Print();48         fprintf(stderr, "Call failed\n");49         return 1;50 }51 Py_Finalize();52     system("pause");53     return 0;54 }

参考

https://docs.python.org/2/extending/embedding.html

https://www.cnblogs.com/yanzi-meng/p/8066944.html

转载于:https://www.cnblogs.com/huangsitao/p/10323298.html

C++程序调用python3相关推荐

  1. 子程序调用与宏定义的异同_如何用数控系统进行简单的宏程序调用?老师傅告诉你,用G65就行...

    什么是简单调用?很多人都不知道吧,如果想要深入操作宏, 就先要学会变量,学会变量之担,再去操作宏,就会变得非常的简单,今天给大家分享如何用G65进行简单的宏程序调用. 用户宏的简单宏调用是指在主程序中 ...

  2. java web 调用hadoop_Java及Web程序调用hadoop2.6

    1. hadoop集群: 1.1 系统及硬件配置: hadoop版本:2.6 :三台虚拟机:node101(192.168.0.101).node102(192.168.0.102).node103( ...

  3. C#程序调用cmd执行命令

    酷小孩 原文 C#程序调用cmd执行命令 对于C#通过程序来调用cmd命令的操作,网上有很多类似的文章,但很多都不行,竟是漫天的拷贝.我自己测试整理了一下. 代码: string str = Cons ...

  4. C#程序调用外部程序

    /* *编程语言:VisualStudio.NetC#(Beta2) *作者:迪泊威 *功能:通过C#程序调用Windows记事本程序编辑一个 *名为test.txt的文本文件. * *在整个程序中S ...

  5. openid java_微信小程序调用微信登陆获取openid及java做为服务端示例

    一.微信小程序 第一步:调用 wx.login获取code 文档地址 第二步:判断用户是否授权读取用户信息 文档地址 第三步:调用wx.getUserInfo读取用户数据 文档地址 第四步:由于小程序 ...

  6. 桌面程序调用Web Service应用实例

    作者:朱金灿 来源:blog.csdn.net/clever101 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com ...

  7. 小程序调用微信支付返回错误

    小程序调用wx.requestPayment(OBJECT)这个方法发起微信支付,返回"调用支付JSAPI缺少参数:total_fee"这个错误.查看控制台发现预支付订单id为空( ...

  8. Python Module_subprocess_子进程(程序调用)

    目录 目录 前言 软件环境 认识subprocess Popen Constructor构造函数 Class Popen的参数 args 调用程序 调用Shell指令 stdinstdoutstder ...

  9. GO程序调用C及C++库的实现方式

    还有这个: https://blog.csdn.net/zdy0_2004/article/details/79124269 https://blog.csdn.net/boshuzhang/arti ...

最新文章

  1. WINCE5.0+S3C2440支持大容量SD卡(SDHC卡)
  2. WPF代码模板-布局部分
  3. helm部署minio
  4. VTK:AnatomicalOrientation解剖定位用法实战
  5. 好玩Python--分析你的微信好友签名
  6. hasoffers API 研究
  7. 微信小程序启动过程分析
  8. 附件 计算机 丢失,帮你找回Win7开始菜单附件丢失的工具
  9. 微星主板黑苹果_黑苹果配件选择精细篇
  10. 无缝拼接屏是怎样实现的?有什么特点!
  11. 曾经的荣誉,偶然被唤醒
  12. JavaScript——数组——slice方法
  13. 新版UI聚合支付系统四方系统源码+修复漏洞完美版
  14. win10系统桌面快捷方式图标变为白色方块如何解决
  15. python提取html表格_python html提取表格数据库数据库
  16. 七种常见阈值分割代码(Otsu、最大熵、迭代法、自适应阀值、手动、迭代法、基本全局阈值法)...
  17. 数值分析——两点三次Hermite插值
  18. vue/multi-word-component-names报错处理
  19. 用无穷级数计算cos值
  20. WinRAR 无法关联zip、rar等文件

热门文章

  1. Oracle传统基本体系结构初步介绍(2)
  2. 互联网下一个热点:服务业电子商务
  3. Android Studio链接外部手机模拟器问题
  4. 传感器市场需求大幅提升 中企能否满足?
  5. 《Python参考手册(第4版•修订版)》——1.8 集合
  6. ant+testng 搭建
  7. Linux时间子系统之八:动态时钟框架(CONFIG_NO_HZ、tickless)【转】
  8. cxf-2.4.1 webservice客户端调用代码
  9. 为什么会自动打开Nautilus文件管理器?
  10. Thinkpad SU使用方法FOR 2008