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文件)相关推荐

  1. python执行py文件生成pyc_python生成pyc文件

    pyc文件是py文件编译后生成的字节码文件(byte code).pyc文件经过python解释器最终会生成机器码运行.所以pyc文件是可以跨平台部署的,类似Java的.class文件.一般py文件改 ...

  2. python中执行py文件出错(提示File “<stdin>”,line 1,SyntaxError:invalid syntax)

    python中执行py文件出错(提示File "<stdin>",line 1,SyntaxError:invalid syntax) 解决办法: 上图中已通过输入py ...

  3. python命令行执行 .py文件提示ModuleNotFoundError: No module named 'XXX' 解决方法

    今天用Jenkins执行.py文件时,总是提示ModuleNotFoundError: No module named 'XXX',百思不得其解.但是在PyCharm中却是能执行成功的,想了想然后在终 ...

  4. 使用Cython库包对python的py文件(源码)进行加密,把python的.py文件生成.so文件并调用

    文章目录: 1 准备环境 2 调用`Cython库包`把python的`.py`文件生成`.so`文件 2.1 写源码文件 2.2 调用源码接口 2.3 调用Cython库把`.py`源码生成`.so ...

  5. python3.6卸载教程_Python3.6安装卸载、执行命令、执行py文件的方法详解

    开发一个功能,C/C++可能要500行代码,Java可能需要200行代码,然而Python可能需要50行代码,虽然代码少,可能开发的飞起,但是这其实是已牺牲运行效率位代价的,可能C只要1秒,Java需 ...

  6. python打不开py文件查看代码,用python打开py文件

    .py文件无法用python打开 刚刚把python更新到python3.7.2 但是发现之前写的.py的文件双击没有任何我去,你的情况和我一模一样,我也是环境变量和注册表按照网上的方法设置了,却还是 ...

  7. python怎么调用另一个py文件的变量,Python中py文件引用另一个py文件变量的方法

    Python中py文件引用另一个py文件变量的方法 最近自己初学Python,在编程是遇到一个问题就是,怎样在一个py文件中使用另一个py文件中变量,问题如下: demo1代码 import requ ...

  8. 怎么在命令行执行.py文件,py文件生成可执行文件

    大家好,小编来为大家解答以下问题,怎么在命令行执行.py文件,怎么运行python的py文件,现在让我们一起来看看吧! 1.后缀PY的文件怎么用? 后缀PY的文件可以用Python软件打开,具体操作步 ...

  9. python3.6.6卸载_Python3.6安装卸载、执行命令、执行py文件的方法详解

    Python3.6安装卸载.执行命令.执行py文件的方法详解 开发一个功能,C/C++可能要500行代码,Java可能需要200行代码,然而Python可能需要50行代码,虽然代码少,可能开发的飞起, ...

  10. python转换成exe后一闪而过_解决python xx.py文件点击完之后一闪而过的问题

    解决python xx.py文件点击完之后一闪而过的问题 1.问题复现: 有时候我们去点击.py文件 文件里明明有打印信息,却一闪而过,没有任何显示 比如以下内容 #!/usr/local/bin/p ...

最新文章

  1. 【iOS-Cocos2d游戏开发之十五】详解CCProgressTimer 进度条并修改cocos2d源码实现“理想”游戏进度条!...
  2. 解决Eclipse代码分析插件SonarLint在Console输出乱码问题
  3. jQuery对Ajax的封装应用(三)
  4. java迭代器逆序_迭代器
  5. plt.axis()用法详解
  6. Web后端学习笔记 Flask (5) 数据库
  7. java获取泛型的类型_Java反射获取泛型类型
  8. Linux下修改PATH的方法
  9. leetcode——给定一个整数数组和一个目标值返回两个数字对应的索引,使得这两个数字之和等于目标值
  10. js错误处理权威指北
  11. 网页自动调入软键盘输入中文
  12. Go的全新漏洞检测工具govulncheck来了
  13. SAP那些事-职业篇-25-顾问的价值
  14. 转 CSS兼容技巧整理--从IE6-IE9 火狐谷歌浏览器兼容
  15. Paddle Quantum 量桨入门手册
  16. 计算机网络的雏形,计算机网络的发展雏形是什么(图文)
  17. 51单片机三线串行驱动12864液晶
  18. 谷歌排名影响因素最新研究(SEM RUSH版)
  19. bmp文件数字水印c语言代码,图像数字水印+matlab程序文件.doc
  20. POI设置word 2007文本下划线样式及文字底纹

热门文章

  1. 联想笔记本电脑u盘重装win10系统教学
  2. 服务器显示器超分辨率,显示器分辨率超频1080超到2K屏方法
  3. zencart模板如何设计
  4. tensorflow serving入门笔记
  5. 消息中间件RabbitMQ
  6. 5年码农吐血推荐10款用了就离不开的网站
  7. matlab 计算电极上瞬时电流电压,[]基于MATLAB的感应加热电源仿真.doc
  8. 10/13 Total variation loss 全变分
  9. MongoDB 3.4安装及配置
  10. XPath之电影天堂数据爬取