ctypepython
『壹』 python 外部函數調用庫ctypes簡介
一直對不同語言間的交互感興趣,python和c語言又深有淵源,所以對python和c語言交互產生了興趣。
最近了解了python提供的一個外部函數庫 ctypes , 它提供了C語言兼容的幾種數據類型,並且可以允許調用C編譯好的庫。
這里是閱讀相關資料的一個記錄,內容大部分來自 官方文檔 。
ctypes 提供了一些原始的C語言兼容的數據類型,參見下表,其中第一列是在ctypes庫中定義的變數類型,第二列是C語言定義的變數類型,第三列是Python語言在不使用ctypes時定義的變數類型。
創建簡單的ctypes類型如下:
使用 .value 訪問和改變值:
改變指針類型的變數值:
如果需要直接操作內存地址的數據類型:
下面的例子演示了使用C的數組和結構體:
創建指針實例
使用cast()類型轉換
類似於C語言定義函數時,會先定義返回類型,然後具體實現再定義,當遇到下面這種情況時,也需要這么干:
可以簡單地將"so"和"dll"理解成linux和windows上動態鏈接庫的指代,這里我們以Linux為例。注意,ctypes提供的介面會在不同系統上有出入,比如為了載入動態鏈接庫, 在Linux上提供的是 cdll , 而在Windows上提供的是 windll 和 oledll 。
ctypes會尋找 _as_paramter_ 屬性來用作調用函數的參數傳入,這樣就可以傳入自己定義的類作為參數,示例如下:
用 argtypes 和 restype 來指定調用的函數返回類型。
這里我只是列出了 ctypes 最基礎的部分,還有很多細節請參考官方文檔。
這兩天文章沒有寫,先是早出晚歸出去玩了一整天,然後加班到凌晨3點左右,一天一篇計劃劃水得嚴重啊…
『貳』 c可以調用python嗎
可以的。
C中內嵌Python
新建立一個工程,首先需要將工作目錄設置到Python-3.1.1PCbuild中,以獲取到動態庫,至於靜態庫的包含,Include目錄的指定,那自然也是少不了的。文件中需要包含Python.h文件,這也是必須的。
介面中
Py_Initialize();
Py_Finalize();
其他的根據需求,再引入相應的python builder 即可
『叄』 python怎麼導入ctypes
1. 載入Windows系統自帶的dll文件:
#載入cdecl調用約定的dll
msvcrt =cdll.msvcrt
#載入stdcall調用約定的dll
kernel32 =windll.kernel32
2. 載入自己dll文件,假如為addFuncDll,方式如下:
mydll =CDLL("addFuncDll.dll")
或者 mydll = cdll.addFuncDll
如果其中有函數add,計算兩個整數的和,則使用方式如下:
result=mydll.add(4,5)
可以多一步指明add函數的參數類型(也可不指明):
mydll.add.argtypes= [c_int,c_int]
3. 結構體在python中定義為Structure的子類如下:
class POINT(Structure):
_fields_ = [("x", c_int),
("y",c_int)]
_fields中每一項為元組(成員名稱,類型)
結構體還可以用於其他的結構體:
class RECT(Structure):
_fields_ = [("upperleft",POINT),
("lowerright",POINT)]
『肆』 python ctypes 問題
我在互動式環境下使用沒問題,你查一下環境吧。另外,庫名可以不加後綴名,因為linux下可能是so後綴的,加了也沒關系。
C:\Users\s>python
Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win
32
Type "help", "right", "credits" or "license" for more information.
>>> from ctypes import *
>>> dir(CDLL)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattr__',
'__getattribute__', '__getitem__', '__hash__', '__init__', '__mole__', '__new
__', '__rece__', '__rece_ex__', '__repr__', '__setattr__', '__sizeof__', '__
str__', '__subclasshook__', '__weakref__', '_func_flags_', '_func_restype_']
>>> dll=CDLL("msvcrt")
>>> dll
<CDLL 'msvcrt', handle 75b30000 at 2624570>
>>> dll=CDLL("msvcrt.dll")
>>> dll
<CDLL 'msvcrt.dll', handle 75b30000 at 2608ed0>
『伍』 關於python ctypes里 Union的問題
DataValue(Structure):
_anonymous_ = ('DataValue',)
可能是寫錯了,改成:
class DataValue(Structure):
_anonymous_ = ('DataValue',)
data_value.DataValue = 23
這句報錯嗎?
換成:
data_value.i4Val = 32
試試
如果有問題,希望你把錯誤的原因(traceback)貼出來
『陸』 python用ctypes操作剪切板遇到問題!!
這邊執行沒有問題,版本如下
Python3.5.0(v3.5.0:374f501f4567,Sep132015,02:27:37)[MSCv.190064bit(AMD64)]onwin32
代碼如下
importctypes
defget():
'''從剪切板中獲得字元串'''
h=ctypes.WinDLL('user32.dll')
h.OpenClipboard(0)
aa=h.GetClipboardData(13)
ss=ctypes.c_wchar_p(aa)
h.CloseClipboard()
returnss.value
defset(mystr):
'''把字元串放到剪切板中,成功返回1,失敗返回0'''
u=ctypes.WinDLL('user32.dll')
k=ctypes.WinDLL('kernel32.dll')
s=mystr.encode('utf-16')
s=s[2:]+b'