c++ 調用python

 

http://www.javashuo.com/article/p-mibjswtl-cy.htmlhtml

C++ 調用Python腳本

本人環境python

Windows10;app

python3.7.4;函數

visual studio 2019;測試

安裝python,opencv(若是用到的話),以及將兩者目錄添加到vs中的包含目錄和庫目錄就再也不說了。教程一大堆,本身配置好。如下步驟都創建在這些環境配置成功以後。ui

重要spa

將Python安裝目錄下的includelibs文件夾引入到項目中
libs目錄下的python37.lib複製一份爲python37_d.lib
.net

 

1、Python腳本3d

這個python腳本和C++編譯成功後生成的.exe文件放在同一目錄下。code

1

2

3

4

5

def Hello():

    print("Hello")

     

def Add(a,b):

    return  a+b

 

2、C++調用python腳本

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

#include <Python.h>

using namespace std;

 

int main()

{

    Py_Initialize();              //初始化,建立一個Python虛擬環境

    if (Py_IsInitialized())

    {

        PyObject* pModule = NULL;

        PyObject* pFunc = NULL;

        pModule = PyImport_ImportModule("test_python");  //參數爲Python腳本的文件名

        if (pModule)

        {

            pFunc = PyObject_GetAttrString(pModule, "Hello");   //獲取函數

            PyEval_CallObject(pFunc, NULL);           //執行函數

        }

        else

        {

            printf("導入Python模塊失敗...\n");

        }

    }

    else

    {

        printf("Python環境初始化失敗...\n");

    }

    Py_Finalize();

}

 

須要將Python安裝目錄下的LibDlls放到程序運行目錄下,並添加Python37.dll到運行目錄便可(我是這麼作的)。

 

運行結果:

 

 

ok,成功調用python腳本。

 

附上C++調用python的一些規範化語句:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

#include<Python.h> //添加python的聲明

 

using namespace std;

 

int main()

{

Py_Initialize(); //一、初始化python接口

 

//初始化使用的變量

PyObject* pModule = NULL;

PyObject* pFunc = NULL;

PyObject* pName = NULL;

 

//二、初始化python系統文件路徑,保證能夠訪問到 .py文件

PyRun_SimpleString("import sys");

PyRun_SimpleString("sys.path.append('./')");

 

//三、調用python文件名。當前的測試python文件名是test.py。在使用這個函數的時候,只須要寫文件的名稱就能夠了。不用寫後綴。

pModule = PyImport_ImportModule("test");

 

//四、調用函數

pFunc = PyObject_GetAttrString(pModule, "AdditionFc");

 

//五、給python傳參數

PyObject* pArgs = PyTuple_New(2);//函數調用的參數傳遞均是以元組的形式打包的,2表示參數個數。若是AdditionFc中只有一個參數時,寫1就能夠了。這裏只先介紹函數必須有參數存在的狀況。

 

 

PyTuple_SetItem(pArgs, 0, Py_BuildValue("i", 2)); //0:表示序號。第一個參數。

PyTuple_SetItem(pArgs, 1, Py_BuildValue("i", 4)); //1:也表示序號。第二個參數。i:表示傳入的參數類型是int類型。

 

//六、使用C++的python接口調用該函數

PyObject* pReturn = PyEval_CallObject(pFunc, pArgs);

 

//七、接收python計算好的返回值

int nResult;

PyArg_Parse(pReturn, "i", &nResult);//i表示轉換成int型變量。在這裏,最須要注意的是:PyArg_Parse的最後一個參數,必須加上「&」符號。

 

//八、結束python接口初始化

Py_Finalize();

}

發佈了2832 篇原創文章 · 獲贊 1101 · 訪問量 575萬+
相關文章
相關標籤/搜索