python C C python合 體開發

2021-07-24 23:49:26 字數 4514 閱讀 3724

之前開發python一直都是用c++的system()呼叫指令碼執行某些相關處理

然而需要返回值時,卻感覺到了相當的蛋疼。即使我們可以強行奪取system的返回值(py**裡sys.exit(0))來實現整型的返回值

但其也不是乙個長久之計。更何況如果我們需要其它型別的返回值呢?比如說最常見的字串型別。那就只能讓兩者關聯

下面我們就來看看   如何讓python和c++完美的結♂合在一起~

①我們先建立乙個python指令碼,比如說實現a+b的功能

#retstr_test function 

import sys

def retstr_test(a,b):

print "mdzz:"+str(a)+"+"+str(b)+"="+str(a+b)+"!"

return "mdzz:"+str(a)+"+"+str(b)+"="+str(a+b)+"!"

#retstr_test(int(sys.argv[1]),int(sys.argv[2]))

最後一行為測試時的入口,關聯c++程式時請注釋掉~

好,確認我們python裡的函式retstr_test沒有問題後,進行下一步

②配置python環境

匯入python相關的標頭檔案與lib包

③如果出現【無法開啟檔案「python27_d.lib】報錯的話

修改pyconfig.h檔案

將這裡的python27_d.lib修改為python27.lib,也可以複製乙份python27.lib名為python27_d.lib

/* for an msvc dll, we can nominate the .lib files used by extensions */

#ifdef ms_coredll

# ifndef py_build_core /* not building the core - must be an ext */

# if defined(_msc_ver)

/* so msvc users need not specify the .lib file in

their makefile (other compilers are generally

taken care of by distutils.) */

# ifdef _debug

# pragma comment(lib,"python27.lib")

# else

# pragma comment(lib,"python27.lib")

# endif /* _debug */

# endif /* _msc_ver */

# endif /* py_build_core */

#endif /* ms_coredll */

④如果編譯時出現一些外部引用報錯的話,例如:

修改object.h

注釋掉這個就好了

/* py_debug implies py_trace_refs. */

#if defined(py_debug) && !defined(py_trace_refs)

//#define py_trace_refs

#endif

這些是由於debug問題,你也可以選擇release神馬的……

接下來c++**開發

**中引入python標頭檔案#include "python.h" 

介紹一些相應函式:

pyobject python物件的結構體,我們與python互動時都要以這個為型別

py_initialize(); 初始

py_finalize(); 關閉

py_isinitialized()檢查初始是否成功

pyimport_import(pyobject *pname);載入指令碼

pystring_fromstring(string s);為了配合上乙個函式,將str轉換為pyobject

pymodule_getdict(pyobject *pname)通過引入的模組轉為乙個字典(其實也是pyobject)

pydict_getitemstring(pyobject *pdict, string s);上乙個轉換完了字典物件,以及函式名s

pytuple_new(int n); 引數個數

pytuple_setitem 引數進棧,具體格式見**注釋

pyobject_callobject(pyobject *pfunc, pyobject *pargs)呼叫指令碼,返回pyobject型別

pyarg_parse(pyobject *result, "s", &strret);格式轉換

完整**如下:

// call_py_test.cpp : 定義控制台應用程式的入口點。

//#include "stdafx.h"

#include "python.h"

#include #include using namespace std;

int main(int argc, char** argv)

// 新增當前路徑

//把輸入的字串作為python**直接執行,返回0

//表示成功,-1表示有錯。大多時候錯誤都是因為字串

//中有語法錯誤。

pyrun_******string("import sys");

pyobject *pname,*pmodule,*pdict,*pfunc,*pargs;

// 載入名為pytest的指令碼

pname = pystring_fromstring("pytest"); //我的指令碼直接放在了debug下

pmodule = pyimport_import(pname);

if ( !pmodule )

pdict = pymodule_getdict(pmodule);

if ( !pdict )

// 找出函式名為retstr_test的函式

pfunc = pydict_getitemstring(pdict, "retstr_test");

if ( !pfunc || !pycallable_check(pfunc) )

// 引數進棧

*pargs;

pargs = pytuple_new(2);

// pyobject* py_buildvalue(char *format, ...)

// 把c++的變數轉換成乙個python物件。當需要從

// c++傳遞變數到python時,就會使用這個函式。此函式

// 有點類似c的printf,但格式不同。常用的格式有

// s 表示字串,

// i 表示整型變數,

// f 表示浮點數,

// o 表示乙個python物件。

int arg1=233; //定義第乙個引數

int arg2=250; //定義第二個引數

pytuple_setitem(pargs, 0, py_buildvalue("i",arg1));

pytuple_setitem(pargs, 1, py_buildvalue("i",arg2));

// 呼叫python函式

char* strret;

pyobject* result=pyobject_callobject(pfunc, pargs);

//返回值型別轉換

pyarg_parse(result, "s", &strret);

cout<

部分內容學習與

雖然我們實現了python與c++的互動,但是是否採用這種手段還要根據具體情況分析。

比如說其呼叫的效能、pyobject物件強轉後的準確性等一系列問題都需要我們長期去測試。

個人認為,如果互動次數不是很多的話,也可以考慮以讀寫文字的形式進行引數的互動

這樣做的好處:

①免去了配置環境及其相關開發的繁瑣流程

②內容傳遞相對來說較安全準確

③其內容可以留存,相當於log

④完全沒有語言、平台等限制

MySQL Perl, 便利之合

首先你應當已經正確安裝了mysql,並配置好使用者密碼。關於安裝並不是本文討論的內容,mysql自帶的大量文件已經描述了所有細節。用mysql.server啟動mysql伺服器,這個命令同時呼叫 safe mysqld 守護程序,因此你可以給它傳參。用mysql h host u user p 連線...

合服測試(一)

合服測試 一 1 提前在內網進行一些業務的預演,比如等級or積分排行榜資訊,pvp資料,pve關卡排名等。根據遊戲業務來 2 在內網裡建立起碼2個庫,執行指令碼合併。3 預演一場斷開,指令碼失敗後,再次執行是否資料出現異常。4 提前準備好外網所需要用到的區服賬號,記錄roleid,區服資訊,渠道賬號...

整數合 leetcode訓練

給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1 2 ...