1 前言
python 是 C 寫的,庫也是 C 寫的,不但 python 可以調用 C 寫的庫,C也能調用為 python 寫的庫,甚至調用 python 語句執行。
嵌入為應用程序提供了用Python而不是C或c++實現應用程序的某些功能的能力。這可以用于許多目的;
一個例子是允許用戶通過用Python編寫一些腳本來根據自己的需要定制應用程序。
如果一些功能可以更容易地用Python編寫,您也可以自己使用它。
嵌入Python類似于擴展它,但并不完全如此。所不同的是,當你擴展Python應用程序的主程序仍然是Python解釋器,
而如果你嵌入Python,主程序可能與Python——相反,應用程序的某些部分偶爾會調用Python解釋器來運行一些Python代碼。
2 案例
?
直接給出一個例子,使用 Qt 調用 python。在 qt 中直接創建 Qt console Application 項目,以下所有內容都是終端應用程序項目。
#define PY_SSIZE_T_CLEAN
#include
#include
#include
using namespace std;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
wchar_t *program = Py_DecodeLocale(argv[0], nullptr);
if (program == nullptr) {
fprintf(stderr, "Fatal error: cannot decode argv[0]\n");
exit(1);
}
Py_SetProgramName(program); /* optional but recommended */
Py_Initialize();
PyRun_SimpleString ("from time import time,ctime\n"
"print('今日是:', ctime(time()))\n"
"print('大家好!')\n"
);
if (Py_FinalizeEx() < 0) {
exit(120);
}
PyMem_RawFree(program);
return a.exec();
}
3.解釋
如果你嵌入Python,你就提供了你自己的主程序。這個主程序要做的一件事就是初始化Python解釋器。
1) 至少,您必須調用函數Py_Initialize()。有一些可選調用將命令行參數傳遞給Python。然后,您可以從應用程序的任何部分調用解釋器。
2) 調用解釋器有幾種不同的方法:可以將包含Python語句的字符串傳遞給PyRun_SimpleString(),
3) 也可以將stdio文件指針和文件名(僅用于在錯誤消息中標識)傳遞給PyRun_SimpleFile()。
4) 您還可以調用低層操作來構造和使用Python對象。
4.運行結果
相當于運行 python語句
from time import time,ctime
print(”今日是:“, ctime(time())
print('”大家好!")
?
5 創建說明
Qtz 中要調用 python 必須明白 python 的 include 和 lib所在的目錄
5.1 查找 python 的目錄
一個命令:python3.7-config --cflags
另外一個命令:python3.7-config --ldflags
分別顯示 python 的頭文件和庫文件所在,在 pro 文件中定義
# $ python3.7-config --cflags
# -I/anaconda3/include/python3.7m -I/anaconda3/include/python3.7m -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I/anaconda3/include -arch x86_64 -I/anaconda3/include -arch x86_64
# $ python3.7-config --ldflags
# -L/anaconda3/lib/python3.7/config-3.7m-darwin -lpython3.7m -ldl -framework CoreFoundation -Wl,-stack_size,1000000 -framework CoreFoundation
INCLUDEPATH += /anaconda3/include/python3.7m
LIBS += -L/anaconda3/lib/python3.7/config-3.7m-darwin -lpython3.7m -ldl
CONFIG += no_keywords
# /anaconda3/include/python3.7m/object.h:450: error: expected member name or ';' after declaration specifiers
# PyType_Slot *slots; /* terminated by slot==0. */
# ~~~~~~~~~~~ ^
5.2 在 pro 文件中添加
CONFIG += no_keywords
就是為了避免python 中的 object.h 文件中有 Qt 的保留字 slots,使用配置忽視它。
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
