今天想做一个简单的管理密码的小程序,由于最近了解了下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的更多相关文章

  1. C#程序调用CodeSoft预先设计好的标签模块实现打印功能

    if (this.tbSetLabel.Text.Trim() == "") { MessageBox.Show("请先 Enter 选择标签模板文件!", & ...

  2. java程序调用存储过程

    java程序调用存储过程       PL/SQL子程序,很多情况下是给应用程序来调用的,所有我们要掌握使用其他编程语言来调用我们写好的存储过程.下面我们介绍下使用java调用Oracle的存储过程. ...

  3. C#:控制台程序调用中间库创建窗体

    1.类库项目引用System.Windows.Forms并添加引用后,才可创建窗体. 2.控制台应用程序调用中间库(DLL)中的方法创建窗体:中间类库使用反射下的Assembly加载包含窗体的类库及创 ...

  4. WindowsForm应用程序调用WebService

    本文原创,如需转载,请标明源地址,谢谢合作!http://blog.csdn.net/sue_1989/article/details/6597078 本文的编写IDE为VSTS2008和.NET F ...

  5. linux下c程序调用reboot函数实现直接重启【转】

    转自:http://www.blog.chinaunix.net/uid-20564848-id-73878.html linux下c程序调用reboot函数实现直接重启 当然你也可以直接调用syst ...

  6. C程序调用shell脚本共有三种方法

    C程序调用shell脚本共有三种法子 :system().popen().exec系列函数call_exec1.c ,内容为:system() 不用你自己去产生进程,它已经封装了,直接加入自己的命令e ...

  7. 利用OllyDebug查看程序调用的dll模块

    最近在做一个Qt项目,在产品发布的时候一直为找不到程序到底缺少了哪些dll组件而困扰.具体问题是,在我的项目中使用到了QMediaPlayer播放一段音频文件,我使用的开发环境的Win7 32位,而在 ...

  8. C#调用Exe文件的方法及如何判断程序调用的exe已结束

    很简单的代码就可以实现C#调用EXE文件,如下: 引入using System.Diagnostics; 调用代码: Process.Start(exe文件名); 或直接 System.Diagnos ...

  9. C#之VS2010ASP.NET页面调用Web Service和winform程序调用Web Service

    一:用ASP.NET调用Web Service 打开VS2010,打开“文件-新建-网站”,选择“ASP.NET网站” 选好存储位置,语言后点击确定,进入默认页面.然后先添加Web引用,把WebSer ...

随机推荐

  1. MPC学习笔记1:基于状态空间模型的预测控制(2)

    基于估计的无约束预测控制 1.引言 基本上这两个部分都是在线性理论的框架下,利用状态空间法来建模.求解控制律.状态空间模型在理论分析上具有很强的优越性,但实际应用中能直接准确且经济地获取系统状态并不容 ...

  2. 新年Flag,零基础程序媛编程学习计划(持续更新ing)~~

    新的一年立下了转行做程序媛的Flag,我是文科妹子,专业是做市场传销…哦不,是市场营销,算是零基础转行,目标是半年内完成自学进入公司工作,目前打算从事的方向短期目标以入行为主,以前端(可以发挥自身审美 ...

  3. configure,make,make install作用和关系的一些理解

    一. 整体关系 为求直观,画了一张大致关系图: 我个人的理解是这样的,将编译安装比作做菜的话, △ configure的作用,以厨师的构想以参数的形式作为输入,生成并输出菜谱,菜谱包含两个部分---- ...

  4. MySQL多实例的环境下,服务器端本地连接到指定实例的问题(sock方式连接)

    涉及到sock连接的问题. 为了测试MySQL的某些个特性,在一个机器上安装了多个MySQL的实例,如下截图,有两个实例,一个端口是8000,一个端口是8001.在使用mysql -uroot -p ...

  5. 其它 搭建https服务器

    原因是这样的,做了个淘宝的数据管理系统(仅供自己使用),然后需要淘宝卖家的生意参谋里面的一些数据,比如实时访客,里面有每个用户搜索什么关键字进来的,这些信息. 自己基于CefSharp开发了一个win ...

  6. Codeforces Round #442 (Div. 2) E Danil and a Part-time Job (dfs序加上一个线段树区间修改查询)

    题意: 给出一个具有N个点的树,现在给出两种操作: 1.get x,表示询问以x作为根的子树中,1的个数. 2.pow x,表示将以x作为根的子树全部翻转(0变1,1变0). 思路:dfs序加上一个线 ...

  7. java中常规使用的mysql语句

    1.登录型校验 limit 1,例如: SELECT `password`FROM workerWHERE phone = 18611406603LIMIT 1 结果无值,不需验证;有值,校验 2.存 ...

  8. Nancy.Net之旅-探索模块

    探索Nancy模块 模块是任何Nancy应用程序中的主角,因为它是您定义应用程序行为的地方,所以无法避免使用它. 事实上,在任何的Nancy应用程序中,声明模块是最基本的要求. 通过继承NancyMo ...

  9. 4. Go常量

    常量就是那些不可以改变的值 Go语言中定义常量的方式: const a = "admin" 则 a 就是一个常量,但实际上其后面的 "admin" 也是一个字符 ...

  10. poj2886(线段树求序列第k小)

    题目链接:https://vjudge.net/problem/POJ-2886 题意:n个人围成一个圈,每个人有姓名s和权值val两个属性,第一轮序号为k的人退出,并根据其val指定下一个人,val ...