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中编写下面代码,编译没有问题说明配置成功

1 #include<Python.h>
2 int main()
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 int main()
 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

时间: 2024-10-11 16:45:10

C++程序调用python3的相关文章

C#程序调用CMD执行命令

在windows环境下,命令行程序为cmd.exe,是一个32位的命令行程序,微软Windows系统基于Windows上的命令解释程序,类似于微软的DOS操作系统.输入一些命令,cmd.exe可以执行,比如输入shutdown -s就会在30秒后关机.总之,它非常有用.打开方法:开始-所有程序-附件 或 开始-寻找-输入:cmd/cmd.exe 回车.它也可以执行BAT文件. 下面介绍使用C#程序调用cmd执行命令: 代码: 1 using System; 2 using System.Coll

通过异步程序调用(APC)实现的定时功能

定时器是一个在特定时间或者规则间隔被激发的内核对象.结合定时器的异步程序调用可以允许回调函数在任何定时器被激发的时候执行.本文的例子代码显示了如何实现. 使用本定时器时,你需要把常量_WIN32_WINNT定义为0x0400,并且此常量应该在包之前定义,以确保声明合适的定时器原型函数. 通过调用CreateWaitableTimer()可以创建一个定时器,此函数返回一个指向内核对象的句柄.若定时器已经存在,你可以通过使用 OpenWaitableTimer()获得一个进程相关的句柄.无论是通过C

WindowsForm应用程序调用WebService

本文原创,如需转载,请标明源地址,谢谢合作!http://blog.csdn.net/sue_1989/article/details/6597078 本文的编写IDE为VSTS2008和.NET Framework3.5 ,其他版本的VS或.Net Framework类似 本示例程序说明:从WinForm程序调用本机的WebServices的方法,返回两个数的和 1. 新建>>项目>>ASP.NET Web 服务应用程序,命名为 WebServiceTest,OK 2.打开Ser

Java及Web程序调用hadoop2.6

1. hadoop集群: 1.1 系统及硬件配置: hadoop版本:2.6 :三台虚拟机:node101(192.168.0.101).node102(192.168.0.102).node103(192.168.0.103): 每台机器2G内存.1个CPU核: node101: NodeManager. NameNode.ResourceManager.DataNode: node102: NodeManager.DataNode .SecondaryNameNode.JobHistoryS

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

代码部分 using System.Diagnostics; public class CmdHelper { private static string CmdPath = @"C:\Windows\System32\cmd.exe"; /// <summary> /// 执行cmd命令 /// 多命令请使用批处理命令连接符: /// <![CDATA[ /// &:同时执行两个命令 /// |:将上一个命令的输出,作为下一个命令的输入 /// &&

WEB程序调用客户端程序

最近一个项目中要点击WEB页面上的链接启动自己编写的程序,而且还要接收参数,google了1.5小时,终于初步试验通过了. 尝试google了:web send message windows form, bs call cs program, custom protocol...多个关键字组合,发现这种技术叫 registered URL protocol,在这篇文章里介绍得比较详细: http://msdn.microsoft.com/en-us/library/aa767914(v=vs.

【ASP.NET Web API教程】3.3 通过WPF应用程序调用Web API(C#)

参考页面: http://www.yuanjiaocheng.net/ASPNET-CORE/core-static-files.html http://www.yuanjiaocheng.net/ASPNET-CORE/setup-mvc.html http://www.yuanjiaocheng.net/ASPNET-CORE/mvc-design-pattern.html http://www.yuanjiaocheng.net/ASPNET-CORE/mvc-routing.html h

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

if (this.tbSetLabel.Text.Trim() == "") { MessageBox.Show("请先 Enter 选择标签模板文件!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error); this.tbSetLabel.Focus(); return; } int VarTag = 0; if (tbVar0.Text.Trim() != "") { Va

winfrom桌面程序调用python解释器

Winfrom桌面程序调用python解释器执行py脚本后台执行完成具体的功能,为什么要这样处理呢?因为我现在的大部分过项目都是后台的脚本处理,界面基本的输入完成之后,将参数按照规则传入到脚本的入口,根据参数的不同执行不同的脚本流程,如果要修改某一个处理过程或者添加新的模块,不需要修改前台的任何代码,只需要在脚本中修改就可以达到需求的效果,简单.方便,风险较小,影响可控等优点. 因此,我做了一个demo,仅供参考,不足之处,请赐教! 界面如图: Start_exe_py的执行代码如下: 1 pr