導航:首頁 > 編程語言 > python如何添加到c程序

python如何添加到c程序

發布時間:2023-02-14 20:00:23

Ⅰ 如何讓python調用C和C++代碼

如何讓python調用C和C++代碼

安裝python後,會有一個chm格式的python手冊。要搞明白如何讓python調用C/C++代碼(也就是寫python的 extension),你需要征服手冊中的
<<Extending && embedding>>厚厚的一章。在昨天花了一個小時看地頭暈腦脹,仍然不知道如何寫python的extension後,查閱了一些其他 書籍,最終在<<Python Programming On Win32>>書中找到了教程。
下面記錄一下如何在visual studio 2005中,寫一段C/C++的MessageBox代碼,然後提供後python調用,最後的結果當然是顯示一個MessageBox.
1. 首先要明白的是,所謂的python擴展(也就是你提供給python的c/c++代碼,不一定是c/c++代碼,可以是其他語言寫的代碼)是一個 dll,並且這個dll放在本機python安裝目錄下的DLLs目錄下(譬如我機器上的路徑是:F:\Program Files\Python25\DLLs),假如我們接下來要寫的擴展mole名為mb,python調用的代碼為: import mb
mb.showMsg("Python's really amazing, I kindda love it!")
python怎麼找到我們的mb模塊呢?就是上面說的,我們要生成一個mb.dll,然後拷貝到Dlls目錄下面,為了區別普通的dll和python專用擴展的dll,我們的 mb.dll修改成mb.pyd(python dll)
2. 搭建環境,我們要使用python提供的c頭文件和lib庫來進行擴展的開發。 在vs 2005下點擊菜單 "工具"->"選項", 打開選項對話框,選擇"項目和解決方案->VC++目錄", 然後在右邊"顯示以下內容的目錄"得comboBox上選擇"包含文件」,添加python的include目錄(我的機器上是"F:\Program
Files\Python25\include"),然後選擇庫文件,添加python的libs目錄(我的機器上是"F:\Program Files\Python25\libs")。
既然擴展是一個dll,接下來我們要建立一個「動態鏈接庫」工程,然後開始寫代碼:
#include <python.h> //python.h是包含python一些定義的頭文件,在python的include目錄下 /*
我的python版本是2.5, 因為安裝python後它沒提供debug下的lib庫文件,因此你必須生成release版的dll,
想要生成dll版本的,你要到python官網上自己去下載python源代碼,當然你可以繼續生成release版本的dll,但dll中包含調試信息

*/
#pragma comment(lib, "python25.lib")
//先不管
static PyObject* mb_showMsg(PyObject* self, PyObject *args); /*
如果你的擴展是mb,那麼必須實現一個initmb函數,並且從dll中導出這個函數,但我們在python中調用import mb時,python會去dll里去調用
initmb函數,這個函數告訴python我們有些什麼函數,該怎麼告訴python我們有一個showMsg函數呢?下面詳解 */
//必須extern "C"下,這樣不會在C++編譯器里不會更改掉導出的函數名字,我第一次就犯了這樣的錯誤
extern "C" __declspec(dllexport) void initmb() { /*
當調用mb.showMsg("Python's really amazing, I kindda love it!")時, 相當於你告訴python我有一個showMsg函數,我們怎麼告訴python去調用我們dll里的mb_showMsg函數呢?技巧就是下面的方式, 定義一個字典數據結構,key => showMsg, value =>mb_showMsg,METH_VARARGS是函數調用方式,仔細查手冊吧 */
static PyMethodDef mbMethods[] = { {"showMsg", mb_showMsg, METH_VARARGS},
{NULL, NULL, NULL} /*sentinel,哨兵,用來標識結束*/ };
//告訴python我們的模塊名叫mb, 模塊包含的函數都在mbMethods字典里 PyObject *m = Py_InitMole("mb", mbMethods); } /*
接下來實現核心功能showMsg */
//第一個self參數我們用不著,具體查手冊,第二個參數是python傳給我們的參數,它是一個python的參數tuple
static PyObject* mb_showMsg(PyObject* self, PyObject *args) {
//我們的showMsg函數需要的是一個字元串參數 const char* msg = NULL; /*

調用特殊參數解碼python傳遞給我們的參數,s是string,我們傳遞接收參數的變數地址,
如果你的功能函數需要兩個參數,在PyArg_parseTuple後面繼續添加接受參數的變數地址,
這個函數的原型是類似printf的不定參數的形式
PyAPI_FUNC(int) PyArg_ParseTuple(PyObject *, const char *, ...); */
if (!PyArg_ParseTuple(args, "s", &msg)) return NULL;
//調用MB
int r = ::MessageBox(NULL, "hello", "Caption:Form C mole", MB_ICONINFORMATION | MB_OK);
//返回值
return Py_BuildValue("i", r); }
將上面這段混雜著大量注釋的代碼拷貝到你的編輯器里,然後編譯生成mb.dll,修改後綴成mb.pyd,然後拷貝到python的DLLs目錄下,打開idle(python的交互程序),寫入代碼: import mb
mb.showMsg("Python's really amazing, I kindda love it!")
可以看到彈出來一個MessageBox。

Ⅱ 怎樣把Python代碼嵌入到C程序

這篇文章主要介紹了將Python代碼嵌入C++程序進行編寫的實例,盡管通常還是Python代碼中調用C++程序的情況較多...需要的朋友可以參考下

把python嵌入的C++裡面需要做一些步驟

安裝python程序,這樣才能使用python的頭文件和庫
在我們寫的源文件中增加「Python.h」頭文件,並且鏈入「python**.lib」庫(還沒搞清楚這個庫時靜態庫還是導出庫,需要搞清楚)
掌握和了解一些python的C語言api,以便在我們的c++程序中使用

常用的一些C API函數

在了解下面的函數之前有必要了解一下**PyObject***指針,python裡面幾乎所有的對象都是使用這個指針來指示的。
Py_Initialize()&&Py_Finalize()

在調用任何python的c函數之前需要調用的函數,「Py_Initialize」是用來初始化python模塊的,推測是載入初始化載入dll的。對應的在使用python模塊之後用「Py_Finalize」來釋放模塊。

PyImport_ImportMole()

用來載入一個python模塊,這個模塊就是一般的python文件。這里需要注意的是,在載入這個模塊的時候會執行模塊裡面所有可以執行的語句。包括import導入語句和在函數體之外的所有語句

PyObject_GetAttrString()

返回模塊裡面的函數

Py_BuildValue()

建立一個參數元組,一般都是用這個函數來建立元組,然後將這個元組作為參數傳遞給python裡面的函數。

PyEval_CallObject()

調用函數,並把「Py_BuildValue」建立的元組作為參數傳遞給被調用的函數

源碼實例

下面的實例是在c++代碼中調用Python的函數,傳遞參數並且獲取返回值

test.cpp代碼

[cpp]view plain

Ⅲ 如何在python中調用C語言代碼

先把C語言代碼做成DLL文件,再用python載入此DLL文件來訪問C語言功能代碼

Ⅳ 如何讓python調用C和C++代碼

要搞明白如何讓python調用C/C++代碼(也就是寫python的extension),你需要征服手冊中的<<Extending && embedding>>厚厚的一章。在昨天花了一個小時看地頭暈腦脹,仍然不知道如何寫python的extension後,查閱了一些其他書籍,最終在<<Python Programming On Win32>>書中找到了教程。 1. 首先要明白的是,所謂的python擴展(也就是你提供給python的c/c++代碼,不一定是c/c++代碼,可以是其他語言寫的代碼)是一個dll,並且這個dll放在本機python安裝目錄下的DLLs目錄下(譬如我機器上的路徑是:F:/Program Files/Python25/DLLs),假如我們接下來要寫的擴展mole名為mb,python調用的代碼為:import mbmb.showMsg("Python's really amazing, I kindda love it!") 2. 搭建環境,我們要使用python提供的c頭文件和lib庫來進行擴展的開發。 在vs 2005下點擊菜單 "工具"->"選項", 打開選項對話框,選擇"項目和解決方案->VC++目錄", 然後在右邊"顯示以下內容的目錄"得comboBox上選擇"包含文件」,添加python的include目錄(我的機器上是"F:/Program Files/Python25/include"),然後選擇庫文件,添加python的libs目錄(我的機器上是"F:/Program Files/Python25/libs")。 既然擴展是一個dll,接下來我們要建立一個「動態鏈接庫」工程,然後開始寫代碼: #include <python.h> //python.h是包含python一些定義的頭文件,在python的include目錄下/*我的python版本是2.5, 因為安裝python後它沒提供debug下的lib庫文件,因此你必須生成release版的dll, 想要生成dll版本的,你要到python官網上自己去下載python源代碼,當然你可以繼續生成release版本的dll,但dll中包含調試信息*/#pragma comment(lib, "python25.lib")//先不管static PyObject* mb_showMsg(PyObject* self, PyObject *args);/*如果你的擴展是mb,那麼必須實現一個initmb函數,並且從dll中導出這個函數,但我們在python中調用import mb時,python會去dll里去調用 extern "C" __declspec(dllexport) void initmb(){/*當調用mb.showMsg("Python's really amazing, I kindda love it!")時, 相當於你告訴python我有一個showMsg函數,我們怎麼告訴python去調用我們dll里的mb_showMsg函數呢?技巧就是下面的方式,定義一個字典數據結構,key => showMsg, value =>mb_showMsg,METH_VARARGS是函數調用方式,仔細查手冊吧*/static PyMethodDef mbMethods[] = { {"showMsg", mb_showMsg, METH_VARARGS}, {NULL, NULL, NULL} /*sentinel,哨兵,用來標識結束*/};//告訴python我們的模塊名叫mb, 模塊包含的函數都在mbMethods字典里 PyObject *m = Py_InitMole("mb", mbMethods);}/*接下來實現核心功能showMsg*///第一個self參數我們用不著,具體查手冊,第二個參數是python傳給我們的參數,它是一個python的參數tuple static PyObject* mb_showMsg(PyObject* self, PyObject *args){//我們的showMsg函數需要的是一個字元串參數 const char* msg = NULL;/*調用特殊參數解碼python傳遞給我們的參數,s是string,我們傳遞接收參數的變數地址, 如果你的功能函數需要兩個參數,在PyArg_parseTuple後面繼續添加接受參數的變數地址, 這個函數的原型是類似printf的不定參數的形式 PyAPI_FUNC(int) PyArg_ParseTuple(PyObject *, const char *, ...);*/if (!PyArg_ParseTuple(args, "s", &msg)) return NULL;//調用MBint r = ::MessageBox(NULL, "hello", "Caption:Form C mole", MB_ICONINFORMATION | MB_OK);//返回值return Py_BuildValue("i", r);}將上面這段混雜著大量注釋的代碼拷貝到你的編輯器里,然後編譯生成mb.dll,修改後綴成mb.pyd,然後拷貝到python的DLLs目錄下,打開idle(python的交互程序),寫入代碼:import mbmb.showMsg("Python's really amazing, I kindda love it!")

Ⅳ 求助 關於c程序中嵌入Python的問題

在C/C++中嵌入Python也比較簡單,首先需要在VC中添加Python的include文件目錄和lib文件目錄:
VC6.0下,打開 tools->options->directories->show directories for,將Python安裝目錄下的inlude目錄添加到inlude files項中,將libs目錄添加到library files項中。
VC2005下,打開tools->options->項目和解決方案->VC++目錄,然後做相同工作。

代碼如下:
//在debug下執行出錯,「無法找到python31_d.lib文件」,後查到原因是:在debug下生成必須要有python31_d.lib文件,否則只能在release下生成
#include <python.h>
int main()
{
Py_Initialize();
PyRun_SimpleString("Print 'hi, python!'");
Py_Finalize();
return 0;
}

Py_Initialize函數原型是:void Py_Initialize(),在嵌入Python腳本時必須使用該函數,它初始化Python解釋器,在使用其他的Python/C API之前必須先調用該函數。可以使用Py_IsInitialized函數判斷是否初始化成功,成功返回True。
PyRun_SimpleString函數原型是int PyRun_SimpleString(const char *command),用來執行一段Python代碼。注意:是否需要維持語句間的縮進呢?
Py_Finalize函數原型是void Py_Finalize(),用於關閉Python解釋器,釋放解釋器所佔用的資源。

PyRun_SimpleFile函數可以用來運行".py"腳本文件,函數原型如下:
int PyRun_SimpleFile(FILE *fp, const char *filename);
其 中fp是打開的文件指針,filename是要運行的python腳本文件名。但是由於該函數官方發布的是由visual studio 2003.NET編譯的,如果使用其他版本的編譯器,FILE定義可能由於版本原因導致崩潰。同時,為簡便起見可以使用如下方式來代替該函數:
PyRun_SimpleString("execfile(『file.py』)"); //使用execfile來運行python文件

Py_BuildValue()用於對數字和字元串進行轉換處理,變成Python中相應的數據類型(在C語言中,所有Python類型都被聲明為PyObject類型),函數原型如下:
PyObject *Py_BuildValue(const char *format, …..);
PyString_String()用於將PyObject*類型的變數轉換成C語言可以處理的char*型,具體原型如下:
char* PyString_String(PyObject *p);

列表操作函數:
PyObject * PyList_New(Py_ssize_t len);
int PyList_SetItem(PyObject *list, Py_ssize_t index, PyObject *item);
PyObject * PyList_GetItem(PyObject *list, Py_ssize_t index);
int PyList_Append(PyObject *list, PyObject *item);
int PyList_Sort(PyObject *list);
int PyList_Reverse(PyObject *list);
Py_ssize_t PyList_Size(PyObject *list);

元組操作函數:
int PyTuple_New(Py_ssize_t len);
int PyTuple_SetItem(PyObject *p, Py_ssize_t pos, PyObject *o);
PyObject * PyTuple_GetItem(PyObject *p, Py_ssize_t pos);
int _PyTuple_Resize(PyObject **p, Py_ssize_t newsize); //注意是**指針

字典操作函數:
PyObject * PyDict_New();
int PyDict_SetItem(PyObject *p, PyObject *key, PyObject *val);
int PyDict_SetItemString(PyObject *p, const char *key, PyObject *val);
PyObject* PyDict_GetItem(PyObject *p, PyObject *key);
PyObject* PyDict_GetItemString(PyObject *p, const char *key);
//與PyDict_SetItemString對應
int PyDict_DelItem(PyObject *p, PyObject *key);
int PyDict_DelItemString(PyObject *p, char *key);
//與PyDict_SetItemString對應
int PyDict_Next(PyObject *p, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue);
PyObject* PyDict_Items(PyObject *p);
PyObject* PyDict_keys(PyObject *p);
PyObject* PyDict_Values(PyObject *p);

在C/C++中使用Python對象應正確地處理引用計數問題,否則容易導致內存泄漏。當使用Python/C API中的函數創建列表、元組、字典等後,在對其完成操作後應該使用Py_CLEAR()和Py_DECREF()等宏來銷毀這些對象。原型如下:
void Py_CLEAR(PyObject *o);
void Py_DECREF(PyObject *o);
其中,對於Py_CLEAR函數,參數可以為NULL指針,表示不進行任何操作,但是Py_DECREF函數不能為NULL指針,否則導致錯誤。

使用PyImport_Import()函數可以在C中導入Python模塊,返回一個模塊對象。函數原型為:
PyObject* PyImport_Import(PyObject *name);
PyMole_GetDict()函數可以獲得Python模塊中的函數列表,返回一個字典,字典中的關鍵字為函數名,值為函數的調用地址。原型如下:
PyObject* PyMole_GetDict(PyObject *mole);
使用PyObject_CallObject()函數和PyObject_CallFunction()函數可以在C中調用Python中的函數,原型如下:
PyObject* PyObject_CallObject(PyObject *callable_object, PyObject *args);
//args是元組形式
PyObject* PyObject_CallFunction(PyObject *callable, char *format, ……);
//format是類似」iss」這樣的參數類型,後面是指定參數
可以使用PyCallable_Check(func)來判斷是否可以調用函數,可以則返回True。

Ⅵ python怎樣嵌入c

用c語言編寫一個動態庫,提供兩個函數,兩個數的整形求和,兩個浮點數的求和。取名為mylib.c。

將c函數文件編譯成so動態庫。運行gcc mylib.c -fPIC -shared -o libtest.so命令,在目錄下可以看到生成的庫文件libtest.so。

Python調用so庫文件。首先導入ctypes,其次用CDLL載入so文件,最後調用對應的函數。將python代碼保存到pydemo.py中。

執行python pydemo.py查看運行結果。

眾多python培訓視頻,盡在python學習網,歡迎在線學習!

Ⅶ 如何使Python嵌入C++應用程序

Python容易擴展和嵌入。Python提供的許多標准模塊支持C或者C++介面。Python和C可以一起工作,它可以嵌入到C或者C++的應用程序當中,因此可用Python語言為應用程序提供腳本介面,由於支持跨語言開發。
可用Python設計概念化應用程序,並逐步移植到C,使用前不必用C重寫應用程序。(Jython使Python可以和Java一起工作,使開發者可以在Python裡面調Java的包,也可以在Java裡面使用Python的對象。還有更妙的,由於Jython的解釋器完全用Java編寫,因此可以在支持Java的任何平台上部署Python程序,甚至WEB瀏覽器也可以直接運行Python腳本。)
提出問題在某個C++應用程序中,我們用一組插件來實現一些具有統一介面的功能,我們使用Python來代替動態鏈接庫形式的插件,這樣可以方便地根據需求的變化改寫腳本代碼,而不是必須重新編譯鏈接二進制的動態鏈接庫。Python強大的功能足以勝任,但是有一些操作系統特定的功能需要用C++來實現,再由Python調用。所以,最基礎地,我們需要做到:
1. 把Python嵌入到C++應用程序中,在C++程序中調用Python函數和獲得變數的值;
2. 用C++為Python編寫擴展模塊(動態鏈接庫),在Python程序中調用C++開發的擴展功能函數。

Ⅷ C程序用Python做插件該怎麼實現

Python 是一種用於快速開發軟體的編程語言,它的語法比較簡單,易於掌握,但存在執行速度慢的問題,並且在處理某些問題時存在不足,如對計算機硬體系統的訪問,對媒體文件的訪問等。而作為軟體開發的傳統編程語言 C 語言,卻能在這些問題上很好地彌補 Python 語言的不足。因此,本文通過實例研究如何在 Python 程序中整合既有的 C 語言模塊,包括用 C 語言編寫的源程序和動態鏈接庫等,從而充分發揮 Python 語言和 C 語言各自的優勢。
概覽

背景知識介紹
Python 語言的特點

Python 作為一門程序開發語言,被越來越多地運用到快速程序開發。Python 是一種解釋型的,互動的,面向對象的編程語言,它包含了模塊化的操作,異常處理,動態資料形態,以及類型的使用。它的語法表達優美易讀,具有很多優秀的腳本語言的特點:解釋的,面向對象的,內建的高級數據結構,支持模塊和包,支持多種平台,可擴展。而且它還支持互動式方式運行,圖形方式運行。它擁有眾多的編程界面支持各種操作系統平台以及眾多的各類函數庫,利用 C 和 C++ 可以對它進行擴充。
C 語言的特點

C 語言作為最受人們歡迎的語言之一,有廣泛的發展基礎。簡潔緊湊、靈活方便,功能強大是其特點。另外,C 語言是一門中級語言。它把高級語言的基本結構和語句與低級語言的實用性結合起來。由於可以直接訪問物理地址,可以方便的對硬體進行操作。因此,很多的系統軟體都是由 C 語言編寫。
Python 語言與 C 語言的交互

為了節省軟體開發成本,軟體開發人員希望能夠縮短的軟體的開發時間,希望能夠在短時間內開發出穩定的產品。Python 功能強大,簡單易用,能夠快速開發應用軟體。但是由於 Python 自身執行速度的局限性,對性能要求比較高的模塊需要使用效率更高的程序語言進行開發,例如 C 語言,系統的其他模塊運用 Python 進行快速開發,最後將 C 語言開發的模塊與 Python 開發的模塊進行整合。在此背景下,基於 Python 語言與 C 語言的各自特點,用 C 語言來擴展現有的 Python 程序,顯得很有意義。本文首先介紹幾種常用的整合 Python 程序與 C 語言程序的方法,最後給出相應的實例。
利用 ctypes 模塊整合 Python 程序和 C 程序
ctypes 模塊

ctypes 是 Python 的一個標准模塊,它包含在 Python2.3 及以上的版本里。ctypes 是一個 Python 的高級外部函數介面,它使得 Python 程序可以調用 C 語言編譯的靜態鏈接庫和動態鏈接庫。運用 ctypes 模塊,能夠在 Python 源程序中創建,訪問和操作簡單的或復雜的 C 語言數據類型。最為重要的是 ctypes 模塊能夠在多個平台上工作,包括 Windows,Windows CE,Mac OS X,Linux,Solaris,FreeBSD,OpenBSD。

接下來通過幾個簡單的例子來看一下 ctypes 模塊如何整合 Python 程序和 C 程序。
源代碼層面上的整合

利用 Python 本身提供的 ctypes 模塊可以使 Python 語言和 C 語言在源代碼層面上進行整合。本節介紹了如何通過使用 ctypes 庫,在 Python 程序中可以定義類似 C 語言的變數。

下表列出了 ctypes 變數類型,C 語言變數類型和 Python 語言變數類型之間的關系:
表 1. ctypes,c 語言和 Python 語言變數類型關系

閱讀全文

與python如何添加到c程序相關的資料

熱點內容
jellyfin插件怎麼選擇主伺服器 瀏覽:836
asp用戶注冊源碼 瀏覽:48
什麼是照片壓縮文件 瀏覽:392
java調用js代碼 瀏覽:979
崑山市民app怎麼修改身份信息 瀏覽:779
php登陸次數 瀏覽:744
python字元轉成數字 瀏覽:822
海川用的是什麼伺服器 瀏覽:376
口才是練出來的pdf 瀏覽:458
雲伺服器哪個公司性價比高 瀏覽:517
源碼論壇打包 瀏覽:558
php怎麼做成word 瀏覽:692
python批量生成密鑰 瀏覽:492
程序員要不要考社區人員 瀏覽:150
app的錢怎麼充q幣 瀏覽:814
android銀行卡識別 瀏覽:756
怎麼在app投放廣告 瀏覽:11
手機文件管理怎麼看app名稱 瀏覽:192
程序員學數學哪本書最全 瀏覽:789
macd實戰選股公式源碼 瀏覽:644