C++程序调用python3
今天想做一个简单的管理密码的小程序,由于最近了解了下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中编写下面代码,编译没有问题说明配置成功
#include<Python.h>
int main()
{
return ;
}
开始写代码
初始化
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 -;
}
设置调用函数的参数
调用Python函数,参数和返回值都必须为元组
PyObject* args = PyTuple_New();
PyObject* arg1 = PyLong_FromLong();
PyObject* arg2 = PyLong_FromLong();
PyTuple_SetItem(args, , arg1);
PyTuple_SetItem(args, , arg2);
调用函数
PyObject* pValue = PyObject_CallObject(func, args);
输出返回值
if (pValue != NULL)
{
printf("Result of call: %ld\n", PyLong_AsLong(pValue));
Py_DECREF(pValue);
}
释放资源
Py_Finalize();
完整代码
#include<iostream>
#include<Python.h> int main()
{
Py_Initialize();
// 检查初始化是否成功
if (!Py_IsInitialized()) {
return -;
}
// 添加当前路径,可以避免导入模块输入全路径
PyRun_SimpleString("import sys");
PyRun_SimpleString("print ('---import sys---')");
PyRun_SimpleString("sys.path.append('./')");
// 载入名为pytest的脚本
PyObject* pModule = PyImport_ImportModule("pytest");
if (!pModule) // 加载模块失败
{
std::cout << "[ERROR] Python get module failed." << std::endl;
system("pause");
return ;
}
std::cout << "[INFO] Python get module succeed." << std::endl; PyObject* func = PyObject_GetAttrString(pModule, "add");
if (!PyCallable_Check(func))
{
std::cout << "not find add function." << std::endl;
system("pause");
return -;
}
PyObject* args = PyTuple_New();
PyObject* arg1 = PyLong_FromLong();
PyObject* arg2 = PyLong_FromLong();
PyTuple_SetItem(args, , arg1);
PyTuple_SetItem(args, , arg2);
PyObject* pValue = PyObject_CallObject(func, args);
if (pValue != NULL)
{
printf("Result of call: %ld\n", PyLong_AsLong(pValue));
Py_DECREF(pValue);
}
else
{
Py_DECREF(func);
Py_DECREF(pModule);
PyErr_Print();
fprintf(stderr, "Call failed\n");
return ;
}
Py_Finalize();
system("pause");
return ;
}
参考
https://docs.python.org/2/extending/embedding.html
https://www.cnblogs.com/yanzi-meng/p/8066944.html
C++程序调用python3的更多相关文章
- C#程序调用CodeSoft预先设计好的标签模块实现打印功能
if (this.tbSetLabel.Text.Trim() == "") { MessageBox.Show("请先 Enter 选择标签模板文件!", & ...
- java程序调用存储过程
java程序调用存储过程 PL/SQL子程序,很多情况下是给应用程序来调用的,所有我们要掌握使用其他编程语言来调用我们写好的存储过程.下面我们介绍下使用java调用Oracle的存储过程. ...
- C#:控制台程序调用中间库创建窗体
1.类库项目引用System.Windows.Forms并添加引用后,才可创建窗体. 2.控制台应用程序调用中间库(DLL)中的方法创建窗体:中间类库使用反射下的Assembly加载包含窗体的类库及创 ...
- WindowsForm应用程序调用WebService
本文原创,如需转载,请标明源地址,谢谢合作!http://blog.csdn.net/sue_1989/article/details/6597078 本文的编写IDE为VSTS2008和.NET F ...
- linux下c程序调用reboot函数实现直接重启【转】
转自:http://www.blog.chinaunix.net/uid-20564848-id-73878.html linux下c程序调用reboot函数实现直接重启 当然你也可以直接调用syst ...
- C程序调用shell脚本共有三种方法
C程序调用shell脚本共有三种法子 :system().popen().exec系列函数call_exec1.c ,内容为:system() 不用你自己去产生进程,它已经封装了,直接加入自己的命令e ...
- 利用OllyDebug查看程序调用的dll模块
最近在做一个Qt项目,在产品发布的时候一直为找不到程序到底缺少了哪些dll组件而困扰.具体问题是,在我的项目中使用到了QMediaPlayer播放一段音频文件,我使用的开发环境的Win7 32位,而在 ...
- C#调用Exe文件的方法及如何判断程序调用的exe已结束
很简单的代码就可以实现C#调用EXE文件,如下: 引入using System.Diagnostics; 调用代码: Process.Start(exe文件名); 或直接 System.Diagnos ...
- C#之VS2010ASP.NET页面调用Web Service和winform程序调用Web Service
一:用ASP.NET调用Web Service 打开VS2010,打开“文件-新建-网站”,选择“ASP.NET网站” 选好存储位置,语言后点击确定,进入默认页面.然后先添加Web引用,把WebSer ...
随机推荐
- numpy-matrix 方法速查
->matrix.T transpose:返回矩阵的转置矩阵 matrix.H hermitian (conjugate) transpose:返回复数矩阵的共轭元素矩阵 matrix.I in ...
- DOM访问和处理HTML文档的标准方法
innerHTML获取或替换HTML元素的内容 <p id="d">对于错我无法来判断 </p><script type="text/jav ...
- Jquery实现点击表格行变色!
时隔一年左右,学习了新的知识,从尝试Linux部署项目,网络安全,至后端开发,然后用起了Jquery, 而且是必须要做.也让自己见识可能会更广泛一些.对于一个刚毕业的大学生而言.方正我是没有用过jqu ...
- 用VS2015编译pjsip的工程pjproject-vs14
先去官网下载最新的源码包,我用的版本是2.7.1 . 将源代码解压后,在路径:pjproject-3.7.1\pjlib\include\pj 中创建新文件config_site.h,内容如下: #i ...
- 面试必备:ArrayList源码解析(JDK8)
面试必备:ArrayList源码解析(JDK8) https://blog.csdn.net/zxt0601/article/details/77281231 概述很久没有写博客了,准确的说17年以来 ...
- JQuery+formValidator实现表单验证
<!-- 需求: 用户注册页面要有用户名.密码.确认密码.邮箱 用户名文本框:用户名不能为空,且必须为数字与字母的6到12位的组合 密码框:密码不能为空,最少6位,包括至少1个大写字母,1个小写 ...
- ASP.NET Easyui datagrid增删改+sqlhelper
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAjAAAAFxCAYAAABtHZI7AAAgAElEQVR4nOy9DXwU1b3//wmCYHjUPl
- superset在 centos 7安装运行
参考:1.http://blog.csdn.net/u014729236/article/details/76302888?locationNum=2&fps=1 2.https://www. ...
- spring boot + apache camel 传输文件
一 sftp搭建略 这里简单说一下为什么使用sftp.ftp和sftp各有优点,差别并不是太大.sftp安全性好,性能比ftp低.ftp对于java来说并不复杂,效率也高.之所以使用sftp主要是可以 ...
- Python设计模式 - UML - 通信图(Communication Diagram)
简介 通信图表示对象之间的消息往来,是表述时序图中信息交互的另一种UML图,介绍完时序图就要对照学习一下通信图,二者是一体两面的. 通信图和时序图可以相互转换,二者的侧重点不同,通信图侧重哪些对象发送 ...