c++調用python返回字典

      網友投稿 1324 2022-05-30

      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

      41

      42

      43

      44

      45

      46

      47

      48

      49

      50

      51

      52

      53

      54

      55

      56

      57

      58

      59

      60

      61

      62

      63

      64

      65

      66

      67

      68

      69

      70

      71

      72

      73

      74

      75

      76

      77

      78

      79

      80

      81

      82

      83

      84

      85

      86

      87

      88

      89

      90

      91

      92

      93

      94

      95

      96

      97

      98

      99

      100

      101

      102

      103

      104

      105

      106

      107

      108

      109

      110

      #include

      #include

      using namespace std;

      void HelloWorld();

      void Add();

      void TestTransferDict();

      void TestClass();

      int?main()

      {

      cout <

      cout <

      HelloWorld();

      cout <

      Add();

      cout <

      c++調用python返回字典

      TestTransferDict();

      cout <

      TestClass();

      system("pause");

      return?0;

      }

      //調用輸出"Hello World"函數

      void HelloWorld()

      {

      Py_Initialize();??????????????//使用python之前,要調用Py_Initialize();這個函數進行初始化

      PyObject?*?pModule?=?NULL;????//聲明變量

      PyObject?*?pFunc?=?NULL;??????//聲明變量

      pModule?=PyImport_ImportModule("Test001");??????????????//這里是要調用的Python文件名

      pFunc=?PyObject_GetAttrString(pModule,?"HelloWorld");???//這里是要調用的函數名

      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",?5));//0---序號? i表示創建int型變量

      PyTuple_SetItem(pArgs,?1, Py_BuildValue("i",?7));//1---序號

      //返回值

      PyObject?*pReturn?=?NULL;

      pReturn?=?PyEval_CallObject(pFunc, pArgs);??????//調用函數

      //將返回值轉換為int類型

      int?result;

      PyArg_Parse(pReturn,?"i", &result);????//i表示轉換成int型變量

      cout <

      Py_Finalize();

      }

      //參數傳遞的類型為字典

      void TestTransferDict()

      {

      Py_Initialize();

      PyObject?*?pModule?=?NULL;

      PyObject?*?pFunc?=?NULL;

      pModule?=PyImport_ImportModule("Test001");??????//Test001:Python文件名

      pFunc=?PyObject_GetAttrString(pModule,?"TestDict");?//Add:Python文件中的函數名

      //創建參數:

      PyObject?*pArgs?=?PyTuple_New(1);

      PyObject?*pDict?=?PyDict_New();???//創建字典類型變量

      PyDict_SetItemString(pDict,?"Name", Py_BuildValue("s",?"WangYao"));?//往字典類型變量中填充數據

      PyDict_SetItemString(pDict,?"Age", Py_BuildValue("i",?25));?????????//往字典類型變量中填充數據

      PyTuple_SetItem(pArgs,?0, pDict);//0---序號? 將字典類型變量添加到參數元組中

      //返回值

      PyObject?*pReturn?=?NULL;

      pReturn?=?PyEval_CallObject(pFunc, pArgs);??????//調用函數

      //處理返回值:

      int?size?=?PyDict_Size(pReturn);

      cout <

      PyObject?*pNewAge?=?PyDict_GetItemString(pReturn,?"Age");

      int?newAge;

      PyArg_Parse(pNewAge,?"i", &newAge);

      cout <

      Py_Finalize();

      }

      //測試類

      void TestClass()

      {

      Py_Initialize();

      PyObject?*?pModule?=?NULL;

      PyObject?*?pFunc?=?NULL;

      pModule?=PyImport_ImportModule("Test001");??????//Test001:Python文件名

      pFunc=?PyObject_GetAttrString(pModule,?"TestDict");?//Add:Python文件中的函數名

      //獲取Person類

      PyObject?*pClassPerson?=?PyObject_GetAttrString(pModule,?"Person");

      //創建Person類的實例

      PyObject?*pInstancePerson?=?PyInstance_New(pClassPerson, NULL, NULL);

      //調用方法

      PyObject_CallMethod(pInstancePerson,?"greet",?"s",?"Hello Kitty");???//s表示傳遞的是字符串,值為"Hello Kitty"

      Py_Finalize();

      }

      Python代碼如下:

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      #test.py

      def?HelloWorld():

      print?"Hello World"

      def?add(a, b):

      return?a+b

      def?TestDict(dict):

      print?dict

      dict["Age"]?=?17

      return?dict

      class?Person:

      def?greet(self, greetStr):

      print?greetStr

      #print add(5,7)

      #a = raw_input("Enter To Continue...")

      運行結果:

      第一步還是包含頭文件

      第二步,使用python之前,要調用Py_Initialize();這個函數進行初始化。

      幫助文檔中如是說:

      The basic initialization function is Py_Initialize(). This initializes the table of loaded modules, and creates the fundamental modules __builtin__, __main__, sys, and exceptions. It also initializes the module search path (sys.path).

      反正,一開始你一定要調用。

      第三步,聲明一些Python的變量,PyObject類型的。其實聲明也可放在前面,這個倒是無所謂的。

      第四步,import module,也就是你的腳本名字,不需要加后綴名,否則會出錯的。

      第五步,從你import進來的module中得到你要的函數

      pFunc?? = PyObject_GetAttrString(pModule, "函數名");

      上面的例子已經夠清楚的了,最后一個是你要得到的函數的名字

      第六步,調用PyEval_CallObject來執行你的函數,第二個參數為我們要調用的函數的函數。

      第七步,調用Py_Finalize,這個根Py_Initialize相對應的。一個在最前面,一個在最后面。

      注意事項:

      1.若編譯Debug版,請將C:/Python26/libs下的python26.lib復制一份改名為python26_d.lib

      原博地址:http://www.cnblogs.com/Hisin/archive/2012/02/27/2370590.html

      另外還有一篇寫的很好,地址:https://www.cnblogs.com/earvin/p/5423868.html

      C++ Python

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:小白爬蟲第四彈之爬蟲快跑(多進程 + 多線程)
      下一篇:字節碼編程,Byte-buddy篇三《使用委托實現抽象類方法并注入自定義注解信息》
      相關文章
      国产亚洲精品2021自在线| 亚洲综合无码精品一区二区三区| 亚洲第一页在线视频| 亚洲人精品亚洲人成在线| 国产福利电影一区二区三区,亚洲国模精品一区 | 亚洲s码欧洲m码吹潮| 亚洲第一AV网站| 亚洲国产欧美日韩精品一区二区三区 | 97se亚洲国产综合自在线| 久久夜色精品国产亚洲| 亚洲中文久久精品无码ww16| 色欲aⅴ亚洲情无码AV蜜桃| 亚洲欧美成aⅴ人在线观看| 亚洲精品中文字幕乱码| 亚洲最大的视频网站| 亚洲AV无码专区国产乱码电影| 亚洲国产精品18久久久久久| 亚洲人成电影网站久久| 亚洲日韩精品国产3区| 亚洲精品国产高清在线观看| 亚洲AV无码一区二区三区性色| 国产AV无码专区亚洲AV蜜芽| 亚洲五月丁香综合视频| 亚洲中文字幕一区精品自拍| 亚洲成a人片在线观看中文!!!| 亚洲精品免费在线视频| 亚洲一区二区影视| 久久精品国产亚洲av水果派 | 亚洲无码高清在线观看| 亚洲日韩国产一区二区三区在线| 亚洲中文无码永久免费| 亚洲aⅴ天堂av天堂无码麻豆| 男人的天堂亚洲一区二区三区| 亚洲理论片在线中文字幕| 亚洲午夜精品国产电影在线观看| 亚洲AV天天做在线观看| 日本亚洲成高清一区二区三区| 亚洲av成人无码久久精品| 亚洲精品综合久久中文字幕| 亚洲精品第一综合99久久| 成人亚洲国产精品久久|