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.GetAndSetStringGetAndSetString.restype = c_char_pGetAndSetString.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()
{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
参考链接:
https://blog.csdn.net/LaoYuanPython/article/details/97623504 Python中import模块时报SyntaxError: (unicode error)utf-8 codec can not decode 错误的解决办法
https://blog.csdn.net/zichen_ziqi/article/details/79068656 混合编程之——C++调用python2.7&python3.5
4、C++调用python文件中import时报错
参考链接:
https://blog.csdn.net/m0_38125278/article/details/87191971?spm=1035.2023.3001.6557&utm_medium=distribute.pc_relevant_bbs_down.none-task-blog-2defaultOPENSEARCHdefault-17.nonecase&depth_1-utm_source=distribute.pc_relevant_bbs_down.none-task-blog-2defaultOPENSEARCHdefault-17.nonecase C++通过内嵌解释器调用Python及间接调用Python三方库
5、C++多线程调用Python多进程multiprocessing时发现不支持
https://blog.csdn.net/michael2008bj/article/details/51184326 C++多线程调用Python多进程
6、C++调用python文件中的线程以及字符串在C++和python中间的传递
参考链接:
https://blog.csdn.net/qq_32716885/article/details/86289696
python代码
import os
import threading
import timeg_flage = 0def thread_test():while(True):if g_flage == False:print('循环代码段区域')else:breakdef Hello(str):print("%s" % str)return "PythonGoC++"def Add(a, b):return a+bdef Begin_voice():print('开启线程!')global g_flageg_flage = Falsep = threading.Thread(target=thread_test)p.start()def End_voice():print('关闭线程!')global g_flageg_flage = True
C++代码
#include <iostream>
#include "Python.h"
#include <thread>
using namespace std;
void Hello();
void Add();
void Hello1()
{cout << "\n调用Test001.py中的Add函数..." << endl;
}
std::thread *m_pVideoThread = NULL;
PyObject * pModule = NULL;
void Start()
{PyObject * pFunc = NULL;PyObject * pFunc2 = NULL;//Py_SetPythonHome(L"D:\\code\\pythonTestCDll\\CdoPython\\Release");Py_Initialize();//调用Py_Initialize()进行初始化if (!Py_IsInitialized()) {printf("Python envirment initialized fale!");return;}PyRun_SimpleString("import sys");PyRun_SimpleString("sys.path.append('D:/code/pythonTestCDll/CdoPython/Release/DLLs')");//PyRun_SimpleString("sys.path.append('D:/code/pythonTestCDll/CdoPython/Release/Lib')");pModule = PyImport_ImportModule("Test001");//调用的Python文件名 py文件放置exe同级if (pModule == NULL){PyErr_Print();cout << "PyImport_ImportModule Fail!" << endl;return;}pFunc = PyObject_GetAttrString(pModule, "Begin_voice");//调用的函数名PyEval_CallObject(pFunc, NULL);//调用函数,NULL表示参数为空Py_Finalize();//调用Py_Finalize,和Py_Initialize相对应的.
}
int main(int argc, char* argv[])
{cout << "调用Test001.py中的Hello函数..." << endl;Hello();cout << "\n调用Test001.py中的Add函数..." << endl;Add();cout << "调用testMultiprocessingDll.py中的Start函数..." << endl;m_pVideoThread = new std::thread(Start);//Start();_sleep(1000);PyObject * pFunc2 = NULL;pFunc2 = PyObject_GetAttrString(pModule, "End_voice");//调用的函数名PyEval_CallObject(pFunc2, NULL);//调用函数,NULL表示参数为空getchar();return 0;
}
void Hello()
{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");//调用的函数名PyObject *pArgs = PyTuple_New(1);//函数调用的参数传递均是以元组的形式打包的,2表示参数个数PyTuple_SetItem(pArgs, 0, Py_BuildValue("s", "C++DoPython"));//0--序号,i表示创建int型变量PyObject *pReturn = NULL;//PyEval_CallObject(pFunc, NULL);//调用函数,NULL表示参数为空pReturn = PyEval_CallObject(pFunc, pArgs);string result;PyArg_Parse(pReturn, "s", &result);//i表示转换成int型变量printf("%s", result);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();
}
C++调python(执行py文件)相关推荐
- python执行py文件生成pyc_python生成pyc文件
pyc文件是py文件编译后生成的字节码文件(byte code).pyc文件经过python解释器最终会生成机器码运行.所以pyc文件是可以跨平台部署的,类似Java的.class文件.一般py文件改 ...
- python中执行py文件出错(提示File “<stdin>”,line 1,SyntaxError:invalid syntax)
python中执行py文件出错(提示File "<stdin>",line 1,SyntaxError:invalid syntax) 解决办法: 上图中已通过输入py ...
- python命令行执行 .py文件提示ModuleNotFoundError: No module named 'XXX' 解决方法
今天用Jenkins执行.py文件时,总是提示ModuleNotFoundError: No module named 'XXX',百思不得其解.但是在PyCharm中却是能执行成功的,想了想然后在终 ...
- 使用Cython库包对python的py文件(源码)进行加密,把python的.py文件生成.so文件并调用
文章目录: 1 准备环境 2 调用`Cython库包`把python的`.py`文件生成`.so`文件 2.1 写源码文件 2.2 调用源码接口 2.3 调用Cython库把`.py`源码生成`.so ...
- python3.6卸载教程_Python3.6安装卸载、执行命令、执行py文件的方法详解
开发一个功能,C/C++可能要500行代码,Java可能需要200行代码,然而Python可能需要50行代码,虽然代码少,可能开发的飞起,但是这其实是已牺牲运行效率位代价的,可能C只要1秒,Java需 ...
- python打不开py文件查看代码,用python打开py文件
.py文件无法用python打开 刚刚把python更新到python3.7.2 但是发现之前写的.py的文件双击没有任何我去,你的情况和我一模一样,我也是环境变量和注册表按照网上的方法设置了,却还是 ...
- python怎么调用另一个py文件的变量,Python中py文件引用另一个py文件变量的方法
Python中py文件引用另一个py文件变量的方法 最近自己初学Python,在编程是遇到一个问题就是,怎样在一个py文件中使用另一个py文件中变量,问题如下: demo1代码 import requ ...
- 怎么在命令行执行.py文件,py文件生成可执行文件
大家好,小编来为大家解答以下问题,怎么在命令行执行.py文件,怎么运行python的py文件,现在让我们一起来看看吧! 1.后缀PY的文件怎么用? 后缀PY的文件可以用Python软件打开,具体操作步 ...
- python3.6.6卸载_Python3.6安装卸载、执行命令、执行py文件的方法详解
Python3.6安装卸载.执行命令.执行py文件的方法详解 开发一个功能,C/C++可能要500行代码,Java可能需要200行代码,然而Python可能需要50行代码,虽然代码少,可能开发的飞起, ...
- python转换成exe后一闪而过_解决python xx.py文件点击完之后一闪而过的问题
解决python xx.py文件点击完之后一闪而过的问题 1.问题复现: 有时候我们去点击.py文件 文件里明明有打印信息,却一闪而过,没有任何显示 比如以下内容 #!/usr/local/bin/p ...
最新文章
- 【iOS-Cocos2d游戏开发之十五】详解CCProgressTimer 进度条并修改cocos2d源码实现“理想”游戏进度条!...
- 解决Eclipse代码分析插件SonarLint在Console输出乱码问题
- jQuery对Ajax的封装应用(三)
- java迭代器逆序_迭代器
- plt.axis()用法详解
- Web后端学习笔记 Flask (5) 数据库
- java获取泛型的类型_Java反射获取泛型类型
- Linux下修改PATH的方法
- leetcode——给定一个整数数组和一个目标值返回两个数字对应的索引,使得这两个数字之和等于目标值
- js错误处理权威指北
- 网页自动调入软键盘输入中文
- Go的全新漏洞检测工具govulncheck来了
- SAP那些事-职业篇-25-顾问的价值
- 转 CSS兼容技巧整理--从IE6-IE9 火狐谷歌浏览器兼容
- Paddle Quantum 量桨入门手册
- 计算机网络的雏形,计算机网络的发展雏形是什么(图文)
- 51单片机三线串行驱动12864液晶
- 谷歌排名影响因素最新研究(SEM RUSH版)
- bmp文件数字水印c语言代码,图像数字水印+matlab程序文件.doc
- POI设置word 2007文本下划线样式及文字底纹