C++调⽤python(执⾏py⽂件)的全过程1、⾸先要配好vs开发⼯程
注意版本;我这使⽤32位的python那么我vs⼯程这边也选择32位的编译环境去配置
注意点;需要将python安装⽬录的⼀些⽂件拷过来作为vs⼯程使⽤。
2、C++调⽤Python结果
py代码
这⾥引⽤了cdll库也需要放置到运⾏⽬录,py⽂件也是需要放置到运⾏⽬录(也就是exe⽣成所在⽬录)
import os
import time
from ctypes import *
def testDLL():
pDll = CDLL("./pythonTestCDll.dll")
pstr = create_string_buffer(1024, '\0') # 创建字符串缓冲区
# 对输⼊输出参数进⾏声明
GetAndSetString = pDll.GetAndSetString
GetAndSetString.argtypes = [c_char_p]
pchar = GetAndSetString(pstr)
szbuffer = c_char_p(pchar) # 强制转换为c_char_p类型,取其value值
print(pstr.value)
print(szbuffer.value)
def Start():
testDLL()
C++代码
#include <iostream>
#include "Python.h"
using namespace std;
void Hello();
void Add();
void Start();
void Hello1()
{
cout << "\n调⽤Test001.py中的Add函数..." << endl;
}
int main(int argc, char* argv[])
{
/*cout << "调⽤Test001.py中的Hello函数..." << endl;
Hello();
cout << "\n调⽤Test001.py中的Add函数..." << endl;
Add();*/
cout << "调⽤testMultiprocessingDll.py中的Start函数..." << endl;
Start();
getchar();
return 0;
}
void Start()
{
Py_Initialize();//调⽤Py_Initialize()进⾏初始化
if (!Py_IsInitialized()) {
printf("Python envirment initialized fale!");
return;
}
PyObject * pModule = NULL;
PyObject * pFunc = NULL;
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('D:/code/pythonTestCDll/CdoPython/Release/DLLs')");
//PyRun_SimpleString("print(\"sdasd\")");
pModule = PyImport_ImportModule("testMultiprocessingDll");//调⽤的Python⽂件名 py⽂件放置exe同级 if (pModule == NULL)
{
PyErr_Print();
cout << "PyImport_ImportModule Fail!" << endl;
return;
}
pFunc = PyObject_GetAttrString(pModule, "__main__");//调⽤的函数名
PyEval_CallObject(pFunc, NULL);//调⽤函数,NULL表⽰参数为空
Py_Finalize();//调⽤Py_Finalize,和Py_Initialize相对应的.
}
void Hello()python怎么读取py文件
{
Py_Initialize();//调⽤Py_Initialize()进⾏初始化
if (!Py_IsInitialized()) {
printf("Python envirment initialized fale!");
return ;
}
PyObject * pModule = NULL;
PyObject * pFunc = NULL;
PyRun_SimpleString("print(\"sdasd\")" );
pModule = PyImport_ImportModule("Test001");//调⽤的Python⽂件名 py⽂件放置exe同级
if (pModule == NULL)
{
PyErr_Print();
cout << "PyImport_ImportModule Fail!" << endl;
return;
}
pFunc = PyObject_GetAttrString(pModule, "Hello");//调⽤的函数名
PyEval_CallObject(pFunc, NULL);//调⽤函数,NULL表⽰参数为空
Py_Finalize();//调⽤Py_Finalize,和Py_Initialize相对应的.
}
//调⽤Add函数,传两个int型参数
void Add()
{
Py_Initialize();
PyObject * pModule = NULL;
PyObject * pFunc = NULL;
pModule = PyImport_ImportModule("Test001");//Test001:Python⽂件名
pFunc = PyObject_GetAttrString(pModule, "Add");//Add:Python⽂件中的函数名
//创建参数:
PyObject *pArgs = PyTuple_New(2);//函数调⽤的参数传递均是以元组的形式打包的,2表⽰参数个数
PyTuple_SetItem(pArgs, 0, Py_BuildValue("i", 6));//0--序号,i表⽰创建int型变量
PyTuple_SetItem(pArgs, 1, Py_BuildValue("i", 8));//1--序号
//返回值
PyObject *pReturn = NULL;
pReturn = PyEval_CallObject(pFunc, pArgs);//调⽤函数
//将返回值转换为int类型
int result;
PyArg_Parse(pReturn, "i", &result);//i表⽰转换成int型变量
cout << "6 + 8 = " << result << endl;
Py_Finalize();
}
3、报错:ValueError: source code string cannot contain null bytes
参考链接:
4、C++调⽤python⽂件中import时报错
参考链接://www.jb51/article/233313.htm
5、C++多线程调⽤Python多进程multiprocessing时发现不⽀持
C++多线程调⽤Python多进程
C++、Java等编程想提⾼效率,很容易想到的就是使⽤多线程,⽽在Python中,由于使⽤了GIL,使得多线程效率⾮但没有将性能线性提升,反⽽可能会⽐单线程效率还低。在进程间不需要怎么通信的时候,multiprocessing就很好⽤了。但是翻遍了C/Python API没到C语⾔调⽤Python多进程的⽅法。⽽⽬前的项⽬却恰好希望能⽤C++调⽤Python多进程。尝试了好多C/Python API都没有⼀个稳定可靠的⽅案,今天终于试出来了⼀种可⾏的⽅案!
该⽅案的前提是进程间不需要通信!
⽅法很简单,使⽤linux的shell启动python进程!
C++部分思路:
1. 使⽤c++创建多个线程,根据⾃⼰的逻辑写好⼊⼝函数和输⼊参数
2. 在线程⼊⼝函数中,将想要执⾏的linux命令封装成⼀个字符串如s=”python test.py a b c”,其中a,b,c是test.py的系统参数,完成了C++向python的传参,当然只是⼀些简单的类型
3. 定义好python的控制台上的输出,使⽤popen()执⾏s的命令并建⽴管道
4. 获取控制台的输出,并按照已定义好的规则来判断返回信息
5. 根据返回信息,执⾏对应的操作
Python部分思路:
基本不⽤修改,只是把普通的函数传参改为获取系统参数,将函数返回值改为控制台输出,当然返回值类型受限
该⽅案成功解决了C++多线程调⽤Python多进程的问题,提升了效率,缺点是进程间不能通信,只能相互传递⽐较简单的参数!
总结
到此这篇关于C++调⽤python(执⾏py⽂件)的⽂章就介绍到这了,更多相关C++调执⾏py⽂件内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论