Python作為一門腳本解釋語言,本身又很好的結合C++,所以使用Python開發,在效能要求的地方呼叫C/C++底層函式庫,這簡直是神器。本文詳細介紹了Python呼叫C/C++底層函式庫,互相傳值問題,下面一起來看看。
前言
開發環境:
Centos 7 + Python 3.5.1 + Qt Creator(只是使用Qt Creator編譯而已,並沒有使用QT的任何庫)
Python調用C/C++庫,我現在能做到的有兩種方式
1.extern “C” 導出(互傳值比較麻煩,不建議使用這種方式):
將C/C++函式庫做成和平常一樣的DLL和或.so,例如:
//.h文件 #include <Python.h> //.cpp文件 //C/C++ my.so 或者my.dll enter "C" void printHello() { std::cout<<"Hello World"<<std::endl; }
#Python import ctypes from ctypes import * loadso = ctypes.cdll.LoadLibrary mylib = loadso("./my.so") mylib.printHello() >>>Hello world
程式碼解釋:
my.so 有一個C導出函數printHello()
import ctypes : 導入官方的一個函式庫,顧名思義和C有關
loadso = ctypes.cdll.LoadLibrary : loadso 表示載入函式庫用的函式
mylib = loadso(“./my.so”) //或loadso(“my.dll”) 載入my.so函式庫
mylib.printHello() : 呼叫函式庫函數
上述程式碼能正常輸出:Hello World,但是他們沒有互相傳值
Python和C++互相傳值
//.h文件 #include <Python.h> //.cpp文件 enter "C" int printHello(const char* str) { std::cout<<str<<std::endl; return 1; }
那麼Python的問題就來了
str = create_string_buffer(b"Hello World") #mylib.printHello("Hello World") 这里死活就是显示:H,*(str+4)才是'e',*(str+8) 是'l' 依次类推 print (mylib.printHello(str)) >>>Hello World >>>1 #由于对Python不是特别的熟悉 怎么也做不到显示C++返回的字符串, Python只能显示C++返回的字符串子能看到一个地址而已
2.Python擴充C/C++
不多說,直接上程式碼
//.h文件 本来这是C++连接Mysql 我只摘抄部分代#include <Python.h> //.cpp文件 //传递多个参数 Python传过来的参数在args里面 PyObject* printfHello(PyObject* self,PyObject* args) { int i=0 const char* str; if (!PyArg_ParseTuple(args, "i|s", &i,&str)) //i 表示整形 s 表示字符串 return PyLong_FromLong(0); print("%d,%s",i,str); return Py_BuildValue("s","OK"); //向Python返回OK字符串 } //映射 知道MFC的一看就懂 static PyMethodDef MyMethods[] = { {"printfHello", printfHello, METH_VARARGS, //"printHello" 中可调用的函数 METH_VARARGS :带有参数 METH_NOARGS:无参数 "print"}, //说明 {"connect", connect, METH_VARARGS, "connect mysql"}, {NULL, NULL, 0, NULL} }; static PyObject* UtilError; // 向Python中注册模块 static struct PyModuleDef spammodule = { PyModuleDef_HEAD_INIT, "libMysqlUtil", //模块名字 import libMysqlUtil "C++ Connect Mysql", -1, MyMethods };//PyInit_libMysqlUtil 注意名字 一定要PyInit_ 加上你的模块名字 不然Python import 会提示没有定义 PyInit_你的模块名字 PyMODINIT_FUNC PyInit_libMysqlUtil(void) { PyObject* m = nullptr; m = PyModule_Create(&spammodule); //m= Py_InitModule(....) Python 2.7 if(!m) { return m; } UtilError = PyErr_NewException("Util.error",NULL,NULL); Py_INCREF(UtilError); PyModule_AddObject(m,"error",UtilError); return m; }
#python import libMysqlUtil libMysqlUtil.printHello(1,"hello World") >>>1,hello World >>>OK
總結
到目前為止Python和C/C++互相通信,能適應大部分需求,結構體傳值還沒有研究,對於類,使用指針就行,C++裡面是指針,在Python中會將指標轉換成整形,Python將這個整形傳給C++的時候使用PyArg_ParseTuple又將整形會變成類別指標。
更多詳解python如何呼叫C/C++底層函式庫與互傳值相關文章請關注PHP中文網!

Python和C 各有優勢,選擇應基於項目需求。 1)Python適合快速開發和數據處理,因其簡潔語法和動態類型。 2)C 適用於高性能和系統編程,因其靜態類型和手動內存管理。

選擇Python還是C 取決於項目需求:1)如果需要快速開發、數據處理和原型設計,選擇Python;2)如果需要高性能、低延遲和接近硬件的控制,選擇C 。

通過每天投入2小時的Python學習,可以有效提升編程技能。 1.學習新知識:閱讀文檔或觀看教程。 2.實踐:編寫代碼和完成練習。 3.複習:鞏固所學內容。 4.項目實踐:應用所學於實際項目中。這樣的結構化學習計劃能幫助你係統掌握Python並實現職業目標。

在兩小時內高效學習Python的方法包括:1.回顧基礎知識,確保熟悉Python的安裝和基本語法;2.理解Python的核心概念,如變量、列表、函數等;3.通過使用示例掌握基本和高級用法;4.學習常見錯誤與調試技巧;5.應用性能優化與最佳實踐,如使用列表推導式和遵循PEP8風格指南。

Python適合初學者和數據科學,C 適用於系統編程和遊戲開發。 1.Python簡潔易用,適用於數據科學和Web開發。 2.C 提供高性能和控制力,適用於遊戲開發和系統編程。選擇應基於項目需求和個人興趣。

Python更適合數據科學和快速開發,C 更適合高性能和系統編程。 1.Python語法簡潔,易於學習,適用於數據處理和科學計算。 2.C 語法複雜,但性能優越,常用於遊戲開發和系統編程。

每天投入兩小時學習Python是可行的。 1.學習新知識:用一小時學習新概念,如列表和字典。 2.實踐和練習:用一小時進行編程練習,如編寫小程序。通過合理規劃和堅持不懈,你可以在短時間內掌握Python的核心概念。

Python更易學且易用,C 則更強大但複雜。 1.Python語法簡潔,適合初學者,動態類型和自動內存管理使其易用,但可能導致運行時錯誤。 2.C 提供低級控制和高級特性,適合高性能應用,但學習門檻高,需手動管理內存和類型安全。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)