最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++調(diào)用python(執(zhí)行py文件)的全過程

 更新時間:2021年12月30日 12:26:53   作者:zw1996  
這篇文章主要給大家介紹了關(guān)于C++調(diào)用python(執(zhí)行py文件)的相關(guān)資料,文中通過圖文以及實例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

1、首先要配好vs開發(fā)工程

注意版本;我這使用32位的python那么我vs工程這邊也選擇32位的編譯環(huán)境去配置

注意點;需要將python安裝目錄的一些文件拷過來作為vs工程使用。

2、C++調(diào)用Python結(jié)果

py代碼

這里引用了cdll庫也需要放置到運行目錄,py文件也是需要放置到運行目錄(也就是exe生成所在目錄)

import os
import time
from ctypes import *


def testDLL():
    pDll = CDLL("./pythonTestCDll.dll")
    pstr = create_string_buffer(1024,  '\0')    # 創(chuàng)建字符串緩沖區(qū)
    # 對輸入輸出參數(shù)進行聲明
    GetAndSetString = pDll.GetAndSetString
    GetAndSetString.restype = c_char_p
    GetAndSetString.argtypes = [c_char_p]
    pchar = GetAndSetString(pstr)
    szbuffer = c_char_p(pchar)  # 強制轉(zhuǎn)換為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調(diào)用Test001.py中的Add函數(shù)..." << endl;
}
int main(int argc, char* argv[])
{
	/*cout << "調(diào)用Test001.py中的Hello函數(shù)..." << endl;
	Hello();
	cout << "\n調(diào)用Test001.py中的Add函數(shù)..." << endl;
	Add();*/
	cout << "調(diào)用testMultiprocessingDll.py中的Start函數(shù)..." << endl;
	Start();
	getchar();
	return 0;
}
void Start()
{
	Py_Initialize();//調(diào)用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");//調(diào)用的Python文件名  py文件放置exe同級
	if (pModule == NULL)
	{
		PyErr_Print();
		cout << "PyImport_ImportModule Fail!" << endl;
		return;
	}
	pFunc = PyObject_GetAttrString(pModule, "__main__");//調(diào)用的函數(shù)名
	PyEval_CallObject(pFunc, NULL);//調(diào)用函數(shù),NULL表示參數(shù)為空
	Py_Finalize();//調(diào)用Py_Finalize,和Py_Initialize相對應(yīng)的.
}
void Hello()
{
	Py_Initialize();//調(diào)用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");//調(diào)用的Python文件名  py文件放置exe同級
	if (pModule == NULL)
	{
		PyErr_Print();
		cout << "PyImport_ImportModule Fail!" << endl;
		return;
	}
	pFunc = PyObject_GetAttrString(pModule, "Hello");//調(diào)用的函數(shù)名
	PyEval_CallObject(pFunc, NULL);//調(diào)用函數(shù),NULL表示參數(shù)為空
	Py_Finalize();//調(diào)用Py_Finalize,和Py_Initialize相對應(yīng)的.
}
//調(diào)用Add函數(shù),傳兩個int型參數(shù)
void Add()
{
	Py_Initialize();
	PyObject * pModule = NULL;
	PyObject * pFunc = NULL;
	pModule = PyImport_ImportModule("Test001");//Test001:Python文件名
	pFunc = PyObject_GetAttrString(pModule, "Add");//Add:Python文件中的函數(shù)名
												   //創(chuàng)建參數(shù):
	PyObject *pArgs = PyTuple_New(2);//函數(shù)調(diào)用的參數(shù)傳遞均是以元組的形式打包的,2表示參數(shù)個數(shù)
	PyTuple_SetItem(pArgs, 0, Py_BuildValue("i", 6));//0--序號,i表示創(chuàng)建int型變量
	PyTuple_SetItem(pArgs, 1, Py_BuildValue("i", 8));//1--序號
													 //返回值
	PyObject *pReturn = NULL;
	pReturn = PyEval_CallObject(pFunc, pArgs);//調(diào)用函數(shù)
											  //將返回值轉(zhuǎn)換為int類型
	int result;
	PyArg_Parse(pReturn, "i", &result);//i表示轉(zhuǎn)換成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

https://blog.csdn.net/zichen_ziqi/article/details/79068656

4、C++調(diào)用python文件中import時報錯

參考鏈接://m.fzitv.net/article/233313.htm

5、C++多線程調(diào)用Python多進程multiprocessing時發(fā)現(xiàn)不支持

C++多線程調(diào)用Python多進程

C++、Java等編程想提高效率,很容易想到的就是使用多線程,而在Python中,由于使用了GIL,使得多線程效率非但沒有將性能線性提升,反而可能會比單線程效率還低。在進程間不需要怎么通信的時候,multiprocessing就很好用了。但是翻遍了C/Python API沒找到C語言調(diào)用Python多進程的方法。而目前的項目卻恰好希望能用C++調(diào)用Python多進程。嘗試了好多C/Python API都沒有一個穩(wěn)定可靠的方案,今天終于試出來了一種可行的方案!

該方案的前提是進程間不需要通信!

方法很簡單,使用linux的shell啟動python進程!

C++部分思路:

1. 使用c++創(chuàng)建多個線程,根據(jù)自己的邏輯寫好入口函數(shù)和輸入?yún)?shù)

2. 在線程入口函數(shù)中,將想要執(zhí)行的linux命令封裝成一個字符串如s=”python test.py a b c”,其中a,b,c是test.py的系統(tǒng)參數(shù),完成了C++向python的傳參,當然只是一些簡單的類型

3. 定義好python的控制臺上的輸出,使用popen()執(zhí)行s的命令并建立管道

4. 獲取控制臺的輸出,并按照已定義好的規(guī)則來判斷返回信息

5. 根據(jù)返回信息,執(zhí)行對應(yīng)的操作

Python部分思路:

基本不用修改,只是把普通的函數(shù)傳參改為獲取系統(tǒng)參數(shù),將函數(shù)返回值改為控制臺輸出,當然返回值類型受限

該方案成功解決了C++多線程調(diào)用Python多進程的問題,提升了效率,缺點是進程間不能通信,只能相互傳遞比較簡單的參數(shù)!

總結(jié)

到此這篇關(guān)于C++調(diào)用python(執(zhí)行py文件)的文章就介紹到這了,更多相關(guān)C++調(diào)執(zhí)行py文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 編寫C語言程序進行進制轉(zhuǎn)換的問題實例

    編寫C語言程序進行進制轉(zhuǎn)換的問題實例

    這篇文章主要介紹了編寫C語言程序進行進制轉(zhuǎn)換的問題實例,文中附錄了一個各種進制間的轉(zhuǎn)換程序代碼,需要的朋友可以參考下
    2015-08-08
  • Dashboard Interface 應(yīng)用實現(xiàn)操作

    Dashboard Interface 應(yīng)用實現(xiàn)操作

    Dashboard Server Remote Control Interface是一個關(guān)鍵的功能,它為用戶提供了通過TCP/IP協(xié)議遠程控制機器人的能力,執(zhí)行包括開關(guān)機、加載程序、檢查機器人狀態(tài)以及設(shè)置機器人操作模式等多種操作,本文介紹Dashboard Interface 應(yīng)用操作,感興趣的朋友跟隨小編一起看看吧
    2024-08-08
  • C++中的菱形繼承深入分析

    C++中的菱形繼承深入分析

    這篇文章主要介紹了C++中的菱形繼承深入分析的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • Qt實現(xiàn)文本編輯器(二)

    Qt實現(xiàn)文本編輯器(二)

    這篇文章主要介紹了利用Qt實現(xiàn)的一個文本編輯器。本文將具體講解下是如何實現(xiàn)菜單欄以及工具欄上對應(yīng)的需求,感興趣的可以動手試一試
    2022-01-01
  • C++ 中私有繼承的作用

    C++ 中私有繼承的作用

    這篇文章主要介紹了C++ 中私有繼承的作用的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-10-10
  • 矩陣的行主序與列主序的分析

    矩陣的行主序與列主序的分析

    這篇文章主要介紹了矩陣的行主序與列主序的分析的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • Qt實現(xiàn)Flappy Bird游戲

    Qt實現(xiàn)Flappy Bird游戲

    這篇文章主要為大家詳細介紹了Qt實現(xiàn)Flappy Bird游戲,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • C語言文件打開的模式

    C語言文件打開的模式

    這篇文章主要介紹了C語言文件打開的模式,以及相關(guān)的原理和知識點做了分享,有興趣的朋友參考學(xué)習(xí)下。
    2018-03-03
  • 淺談c語言中一種典型的排列組合算法

    淺談c語言中一種典型的排列組合算法

    下面小編就為大家?guī)硪黄獪\談c語言中一種典型的排列組合算法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • C/C++實現(xiàn)監(jiān)控目錄文件變化

    C/C++實現(xiàn)監(jiān)控目錄文件變化

    ReadDirectoryChangesW是Windows操作系統(tǒng)提供的一個函數(shù),用于監(jiān)視目錄的變化,本文主要為大家介紹了如何使用ReadDirectoryChangesW實現(xiàn)監(jiān)控目錄文件變化,需要的可以參考下
    2023-11-11

最新評論

容城县| 宝山区| 礼泉县| 麻栗坡县| 康乐县| 肇庆市| 江津市| 聂拉木县| 舟曲县| 南城县| 揭西县| 建昌县| 永康市| 大关县| 苍南县| 锡林浩特市| 黑河市| 景德镇市| 巢湖市| 甘南县| 寿宁县| 荔浦县| 三江| 友谊县| 雷波县| 赫章县| 阜新市| 石门县| 琼结县| 邹平县| 佛学| 松原市| 嘉善县| 白朗县| 青州市| 台北县| 马龙县| 凤山市| 准格尔旗| 天津市| 石河子市|