之前開發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 ...