QT中呼叫python注意事項

2021-10-05 10:10:19 字數 2517 閱讀 7226

1、如何embedding python,python文件中有專門一章闡述

2、對於python,沒有除錯庫,可直接將執行庫複製乙份,名稱後面加上_d,就可用,可不能源**除錯而已,同時修改

pyconfig.h

#ifdef _debug 

//# define py_debug    //將這行注釋掉

#endif 

和object.h

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

// #define py_trace_refs   //將這行注釋掉

#endif

3、由於qt中定義了slots作為關鍵了,而python3中有使用slot作為變數,所以有衝突,辦法是:

a、在vs中-屬性-c/c++ -預處理器-預處理器定義-中新增:qt_no_keywords指令,

在dt的專案檔案中.pro檔案中新增 config +=_no_keywords指令,再生成vs的專案檔案,也就自動新增了上面的指令

這種方法是全域性的,同時也取消 forever,foreach的巨集定義,因為很多**使用foreach,所以***大;

typedef struct pytype_spec;  

4、在主程式中執行一開始py_initialize(); 時就出現錯誤

解決辦法是:py_setpythonhome((wchar_t*)(l"c:\\python3"));

是因為我安裝python的時候沒有新增pythonhome這個環境變數

在py_initialize()之前呼叫下py_setpythonhome("c:\\python3");就可以了 

5、用於匯入sys模組,以供程式使用,這是基本模組

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

6、在執行pmodule = pyimport_importmodule("jptest"); 語句匯入自定義模組時,返回對pmodule為null,是由於自定義模組的位置不在python系統搜尋的系統目錄列表內,因此解決辦法是在系統搜尋目錄列表中新增目錄:

注意字元中中"\"必須前面加上「\\",也就是單個"\"是轉意符;而且目錄尾部不能新增多餘的\符;如果不能確認可將它們顯示出來用下面這個語句:pyrun_******string("print(sys.path)");

7、資料轉換,在c/c++與python互動時,都是通過pyobject來傳入和傳出資料的,python提供相關函式對pyobject資料進行轉換,轉換時使用格式字串來控制生成的物件型別,具體可參見官方文件:

a) 將c/c++資料轉換成pyobject:

pyobject *pint=py_buildvalue("i",2003);

pyobject *pstr=py_buildvalue("s","this is a string");

pyobject *ptuples=py_buildvalue("()"); //生成空元組,可作為呼叫不包含任何引數的函式時,傳遞空引數

pyobject *ptuples=py_buildvalue("(s)","this is a string");  //生成乙個元素的元組,可作為呼叫只包含乙個字元引數的函式時,傳遞乙個字元引數

b) 將pyobject資料轉換成c/c++資料:

1) int bb=0;  pyarg_parse(pobjcet,"i",&bb);   //這裡pobject是包含整數資料的python物件,第二個字串引數"i"指定轉換型別,第三個引數將結果值存入bb變數;

2) char * cc=null;  pyarg_parse(pobject,"s",&cc);   //這是字串轉換

3) char * cc=null;  pyarg_parse(pobject,"(s)",&cc);   //這是包含乙個字串元素元組轉換

8、呼叫python模組函式時,傳入引數時,要構造乙個引數元組,如:presult = pyobject_callobject(pfunction, args);這裡args就是乙個元組,作為被呼叫函式的引數列表;

a、如引數為空,則這樣構造:args=py_buildvalues("(si)","abc",10);  表示構造二個引數的元組,乙個是字元型,另乙個是整;多個引數,可參照處;

b、如果引數為空,則需構造乙個包含0個元素元組:args=py_buildvalues("()"); 

注意以上二種都在格式字串中包含"()",這是指示構造元;作為函式呼叫引數必須傳遞元組,也必須這樣構;

下例是通過可變引數來構造呼叫函式引數元組:

int pythonhandler::pymodulerunfunction(const char *module, const char *function,

const char *result_format, void *result, const char *args_format, ...)

...presult = pyobject_callobject(pfunction,args); //呼叫函式

python呼叫requests注意事項

python呼叫requests,預設body傳text時候經常會因為格式報錯。我們可以通過傳josn來避免報錯,一種是json接收字典引數,或者json.loads把文字轉字典。下面是json接收字典 def send data self,msg send url self.get access ...

python 注意事項

from functools import reducereduce 函式會對引數序列中元素進行累積。函式將乙個資料集合 鍊錶,元組等 中的所有資料進行下列操作 用傳給 reduce 中的函式 function 有兩個引數 先對集合中的第 1 2 個元素進行操作,得到的結果再與第三個資料用 func...

python注意事項

編寫python的注意事項 表示式與基本語句的不同 結果相同但複雜的表示式系統可能會提示出錯 如22為表示式 print 22 為語句 字元縮排 python有乙個特點,就是具有強制縮排的功能,而強制縮排一般我們採用tab鍵,如果在編寫過程中採用tab和空格鍵並用,系統極有可能會出錯 注釋 注釋是為...