導航:首頁 > 編程語言 > windowspythonc擴展

windowspythonc擴展

發布時間:2023-03-24 23:49:23

python的字典怎麼擴展成C呢拿什麼數據結構接收100分 詳細進來~

1、直接用PyObject。上策
2、轉換成C++ STL的Map容器是直接對應的。中策
3、使用的是數據,而不是結構,只要能讓中間的數據發揮作用,就沒必要一樣的結構,也就是轉換成具體適合你那接下來C中應用的結構。比如只用到某幾個鍵和某幾個值。如果C中根本不應用,就回到1。中策
4、自己在C中實現這種字典。建立散列表或者紅黑樹表。或者最簡單的兩個一維數組,實現key[],value[]的一一對應。下策

⑵ python 擴展和嵌入c/c++ 的方法有哪些 一般用哪個

swig,pyrex,直接寫代碼、寫DLL用ctypes模塊來調用。

⑶ python怎麼作為c語言的擴展

1.環境配置,簡高python3.2裝好,編譯器我直接用的devcpp的編譯器(原因是直接安裝就可以,其它的編譯器我還不會用),將devcpp的bin目錄添加到環境變數path中。
2.准備好your_mole.c文件,這是你自己的C語言寫的擴展程序,確保你的your_mole.c符合python和C的介面要求。
3.python提供了distutils模塊用來方便地將c文件轉變成pyd文件,也是筆者比較推薦的方法。准備好your_mole.c文件後,在同一目錄下創建steup.py文件,文件內容如下:

from distutils.core import setup, Extension

mole1 = Extension('your_mole_name',
sources = ['demo.c'])

setup (name = 'PackageName',
version = '1.0',
description = 'This is a demo package',
ext_moles = [mole1])
注意'your_mole_name'要枝攔跟C文件中PyInit_mole函數的'mole'一樣,否則在後續的步驟中會出錯。
4.建立steup.bat文件,內容只有兩行:
python.exe setup.py build -c mingw32
pause
5.運行steup.bat文件。
6.如果沒有錯誤,在build\lib.win32-3.2下找到生成的pyd文件,放置到PYTHONPATH的攔搭尺目錄中即可被import調用,到此大功告成。注意,python尋找pyd文件不是在sys.path中找,而是在PYTHONPATH指定的目錄中找。

⑷ 如何建立我的C擴展使用MinGW-W64在Python

安裝Python的 windows擴展模塊時發生Unable to find vcvarsall.bat的錯誤,解決方棚掘法豎和納如下余沒: 首先安裝MinGW,在MinGW的安裝目錄下找到bin的文件夾,找到mingw32-make.exe,復制一份更名為make.exe; 把MinGW的路徑添加到環境變數path中,比如MinGW...

⑸ 如何讓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!")

⑹ python擴展的c代碼在哪裡寫

在哪裡寫都可以啊,重要的是編譯過程。給你介紹下編譯過程吧。



在windows和linux下面,對C擴展的編譯方法是不一樣的,我們先來看windows版的。


我們用C實現一個簡單的加法。
首先新建一個文件add.c,代碼如下:

#include<Python.h>;
staticPyObject*add(PyObject*self,PyObject*args);
//一定聲明為static,把他們限制在這個文件范圍里。幾乎所有的參數都是PyObject類型,在python,每個東西都是object。
staticPyObject*add(PyObject*self,PyObject*args)
{
intx=0;
inty=0;
intz=0;
if(!PyArg_ParseTuple(args,"i|i",&x,&y))
returnNULL;
/*第一個參數是self,這個是python用的,每個函數都要有。我們暫時不管。args是一個參數列表。她把所有的參數都整合成一個string。所以
我們需要從這個string里來解析我們的參數。PyArg_ParseTuple來完成這個任務。第一個參數是args,就是我們要轉換的參數。第二個是格式符號。
「s」代表是個string。從args里提取一個參數就寫"s",兩個的話就寫"s|s",如果是一個string,一個int,就寫"s|i",和printf差不多。第三個
參數就是提取出來的參數放置的真正位置。必須傳遞這個參數的地址。對於add,他將提取兩個參數。分別是x和y。*/
z=x+y;
returnPy_BuildValue("i",z);
/*調用完之後我們需要返回結果。這個結果是c的type或者是我們自己定義的類型。必須把他轉換成PyObject,讓python認識。這個用Py_BuildValue
來完成。他是PyArg_ParseTuple的逆過程。他的第一個參數和PyArg_ParseTuple的第二個參數一樣,是個格式化符號。第三個參數
是我們需要轉換的參數。Py_BuildValue會把所有的返回只組裝成一個tutple給python。*/
}
staticPyMethodDefaddMethods[]=
{
{"add",add,METH_VARARGS,"Executeashellcommand."},
{NULL,NULL,0,NULL}
};
/*這個是一個c的結構。他來完成一個映射。我們需要把我們擴展的函數都映射到這個表裡。表的第一個欄位是python真正認識的。是python里的方法名字。第二個欄位是python里的這個方法名字的具體實現的函數名。在python里調用add,真正執行的是用c寫的add函數。第三個欄位是METH_VARARGS,他告訴python,add是調用c函數來實現的。第四個欄位是這個函數的說明。如果你在python里來help這個函數,將顯示這個說明。相當於在python里的函數的文檔說明。*/
PyMODINIT_FUNCinitadd()
{
Py_InitMole("add",addMethods);
}
/*注意,這個函數的名字不能改動。必須是init+模塊名字。我們的模塊名字是add。所以這個函數是initadd()。
這樣python在導入add的模塊時候,才會找到這個函數,並調用。這個函數調用Py_InitMole來將模塊名字和映射表結合在一起。他表示,add這個模塊使用addMethods這個映射表。python應該這樣導入我們的mole的.*/

新建一個setup.py,內容如下:

fromdistutils.coreimportsetup,Extension
mole1=Extension('add',sources=['add.c'])
setup(name='PackageName',version='1.0',description='Thisisademopackage',ext_moles=[mole1])

組建:(由於我的機器上裝了mingw,所以指定了mingw32。默認的編譯器是vs2008。參考:

python setup.py build--compiler=mingw32

執行後會在當前目錄生成一個build目錄及文件:

buildlib.win32-2.6add.pyd

將add.pyd拷貝到當前目錄,並寫一個測試文件test.py,代碼如下:

import add
print add.add(3,4)

執行一下,輸出為7

OK,基本上就是如此了。

在linux下的話,會有少許不同.
即直接用makefile將add.c編譯成.so,python可以直接import,makefile代碼如下:

PYLIB=/usr/bin
PYINC=/usr/include/python2.6
all:add.c
gccadd.c-g-I$(PYINC)-shared-L$(PYLIB)-lpython2.6-oadd.so
clean:
rm-fadd.so

用同樣的測試代碼,可以測試通過。

⑺ 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語言擴展

C-Python,或者CPython,指C實現的Python虛擬機的基礎慶睜API。最通用的Python就是是基於C實現的,它的底層API稱為C-Python
API,所有Python代碼的最終變成這些API以及數據結構的調用,才有了Python世界的精彩。
Cython,准確說Cython是單獨的一門語言,專門用來寫在Python裡面import用的擴展庫。實際上Cython的語法基本上跟Python一致,而Cython有專門的譽族歲「編譯器」先將
Cython代碼轉變成C(自動加入了一大堆的C-Python
API),然後使用C編譯器編譯出最終的Python可調用的模塊。
GIL:Global
Interpreter
Lock,是Python虛擬機的多線程機制的核心機制,翻譯為:全局解釋器鎖。其實Python線程是操作系統級別的線程,在不同平台有不同的底層穗梁實現(如win下就用win32_thread,
posix下就用pthread等),Python解釋器為了使所有對象的操作是線程安全的,使用了一個全局鎖(GIL)來同步所有的線程,所以造成「一個時刻只有一個Python線程運行」的偽線程假象。GIL是個顆粒度很大的鎖,它的實現跟性能問題多年來也引起過爭議,但到今天它還是經受起了考驗,即使它讓Python在多核平台下CPU得不到最大發揮。

⑼ python編譯C擴展報錯

C和Python介面的地方應該沒什麼泄露。
關鍵是你現在是用C,那所有內存分配的地方都有可能泄露唄。 實在不行可以Jython,或者上面提到的Cython

⑽ python文件是以什麼為擴展名的文件

..py - 常規腳本
.py3 - Python3腳本(Python3腳本通常以.py而不是.py3結尾,很少使用)
.pyc - 編譯的腳本(位元組碼)
.pyo - 優化的pyc位元組碼文件(從Python3.5開始,Python將只使用pyc而不是pyo和pyc)
.pyw - 用pythonw.exe執行的Windows的Python腳本
.pyx - 將Cython src轉換為C/C++
.pyd - 作為Windows DLL創建的Python腳本
.pxd - 相當於C/C++頭文件的Cython腳本
.pyi - MyPy存根
.pyi - 存根文件(PEP 484)
.pyz - Python腳本歸檔(PEP 441)(這是一個包含標准Python腳本頭之後的二進制形式的壓縮Python腳本(ZIP)的腳本)
.pywz - 用於MS-Windows的Python腳本歸檔(PEP 441)(這是一個包含標准Python腳本頭之後的二進制形式的壓縮Python腳本(ZIP)的腳本)

閱讀全文

與windowspythonc擴展相關的資料

熱點內容
男主很帥的歐美大尺度電影 瀏覽:356
怎麼消除安卓的系統通知 瀏覽:478
程序員3萬4是稅後嗎 瀏覽:868
javagui窗口 瀏覽:522
風月片網站動漫 瀏覽:289
電影拉幫套 瀏覽:745
鴉王電影國語版 瀏覽:600
造機甲的黑科技小說 瀏覽:779
歐美在線觀看網站 瀏覽:385
python整蠱代碼大全 瀏覽:458
電影 中國 飛機 瀏覽:103
畫江湖推倒常宣靈小說 瀏覽:158
java表格居中 瀏覽:404
能來回穿梭現代和民國的小說 瀏覽:830
法國版未刪 瀏覽:755
java中字元串輸入 瀏覽:185
可愛女友糖糖圓圓小詩 瀏覽:272
如何在雲南交投app辦etc 瀏覽:829
尺度大的男同志電影 瀏覽:925
主角為秦霄的穿越小說 瀏覽:707