本文目錄一覽:
- 1、用C++/Qt 寫Python調試器遇到的問題
- 2、QT中調用Python
- 3、在qt程序中怎麼運行一個python程序
- 4、Qt下無法調用python,打不開文件為什麼
- 5、linux下用qt需要用到python在Py_Initialize就報錯
用C++/Qt 寫Python調試器遇到的問題
在C++中,「類函數指針」和傳統的「函數指針」,是兩個完全不同的東西。
你取一個類的成員函數的地址,得到的是一個類函數指針,也叫成員函數指針。即使你的成員函數定義看起來和普通函數原型完全一樣,它也和這個原型的普通函數指針完全不同,彼此之間不能轉換。
PyEval_SetTrace要求傳入的是一個傳統的函數指針,你傳入一個類函數指針,當然是不行的。編譯器報錯是說無法將一個類函數指針轉換為函數指針。
C++的類函數指針,是一個非常難用的東西,有非常多奇怪的特性,而且不同編譯器對它的支持大不相同,是C++著名的複雜性來源之一,建議不要使用。
你想要的東西,實際上是一個「委託」的概念,不過可惜的是C++並不支持委託。使用boost::function可以實現類似功能,但python的C API介面卻不支持boost::function,所以也不行。
你這種情況,最簡單的方法還是用傳統的函數指針,使用普通函數包裝下類的成員函數,然後把普通函數的指針傳給python。
QT中調用Python
如果你是嵌入的話,應該沒問題。python的庫會暴露c api的,你的qt程序照著python文檔中的embedded章節就好。 看樣子,你的是linux下的,不過一般頭文件就是include/python.h,怎麼會是include/python2.7呢?你寫錯了吧。庫文件應該是在lib下面。
在qt程序中怎麼運行一個python程序
因為process.start()函數實質是採用命令行中”start XXX”的方式啟動XXX。這裡的XXX僅僅適用於大部分的exe可執行文件以及一些常用文件。對於py或者pyw文件都不行。
有兩種解決方案:
另外編寫一個bat用來啟動py文件,就可以使用start啟動這個bat就可以了;
使用另一個函數「QDesktopServices::openUrl」來啟動py文件。具體使用方法請自行百度。不做過多說明。
Qt下無法調用python,打不開文件為什麼
#include QCoreApplication
//包含調用Python相應的頭文件
#include Python.h
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
//初始化Python解釋器,這是調用操作的第一步
Py_Initialize();
if( !Py_IsInitialized() ){
return -1;
}
//執行單句Python語句,用於給出調用模塊的路徑,否則將無法找到相應的調用模塊
PyRun_SimpleString(“import sys”);
PyRun_SimpleString(“sys.path.append(‘./’)”);
//獲取qt_python_fun.py模塊的指針
PyObject* pModule = PyImport_ImportModule(“qt_python_fun”);
if (! pModule){
printf(“Can’t open python file\n”);
return -1;
}
//獲取hello函數的指針
PyObject* pFunhello = PyObject_GetAttrString(pModule,”hello”);
if (!pFunhello){
printf(“Get function hello failed\n”);
return -1;
}
//調用函數,傳入參數為NULL
PyObject_CallFunction(pFunhello,NULL);
//銷毀Python解釋器,這是調用的最後一步
Py_Finalize();
return a.exec();
}
作者:sleepyjoker
鏈接:
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
linux下用qt需要用到python在Py_Initialize就報錯
你在鏈接的時候必須提供正確的鏈接參數 (需要把 libpython 鏈接到你的可執行程序才能正確找到python C API)
具體可以用
pythonX.Y-config –cflags
得到編譯參數。
用
pythonX.Y-config –ldflags
得到鏈接參數
比如在我的系統上python2.7得到的參數是
$ python2.7-config –cflags
-I/usr/include/python2.7 -I/usr/include/python2.7 -fno-strict-aliasing -march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong –param=ssp-buffer-size=4 -DNDEBUG -march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong –param=ssp-buffer-size=4
$ python2.7-config –ldflags
-lpython2.7 -lpthread -ldl -lutil -lm -Xlinker -export-dynami
那麼就在編譯和鏈接的時候分別加入上面列出的參數,就可以了 (注意,不要加我例子中列印出來的內容,要加你自己執行pythonX.Y-config 後得到的內容)。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/239622.html