在Python程序中導(dǎo)入ctypes模塊,載入動態(tài)鏈接庫。動態(tài)鏈接庫有三種:cdll以及windows下的windll和oledll,cdll載入導(dǎo)出函數(shù)使用標準的cdecl調(diào)用規(guī)范的庫,而windll載入導(dǎo)出函數(shù)符合stdcall調(diào)用規(guī)范(Win32 API的原生約定)的庫,oledll也使用stdcall調(diào)用規(guī)范,并假設(shè)函數(shù)返回Windows的HRESULT錯誤代碼。錯誤代碼用于在出錯時自動拋出WindowsError這個Python異常,可以使用COM函數(shù)得到具體的錯誤信息。
使用cdll.msvcrt即可調(diào)用MS標準的C庫msvcrt,msvcrt包含了大部分標準C函數(shù)。
下面來看一下簡單的printf函數(shù)。
from ctypes import * msvcrt = cdll.msvcrt str = "Huanhuan!" msvcrt.printf("Hello %s\n", str)
這樣就可以使用C語言中的printf函數(shù)進行輸出。
如果在IDLE里運行的話會發(fā)現(xiàn)程序沒有任何輸出結(jié)果,這是因為printf是打印到真實的標準輸出,而不是sys.stdout。如果想要看到運行結(jié)果,可以在CMD里運行python test.py來查看結(jié)果,前提是已經(jīng)設(shè)置好了Python的環(huán)境變量。或者有一個曲線方法可以在IDLE中顯示輸出結(jié)果,請曲線閱讀到文章最后。
如果使用的是Py3K,在控制臺里會看到只有開頭字符H被輸出了。因為Py3K使用的是Unicode編碼,而printf不支持該編碼,所以需要轉(zhuǎn)碼。整理出來三種改寫方法可以解決這一問題。
# A 轉(zhuǎn)為byte類型 在字符串前面加b from ctypes import * msvcrt = cdll.msvcrt str = b"Huanhuan!" msvcrt.printf(b"Hello %s\n", str) # B 使用wprintf寬字符顯示 from ctypes import * msvcrt = cdll.msvcrt str = "Huanhuan!" msvcrt.wprintf("Hello %s\n", str) # C 轉(zhuǎn)碼為utf-8 from ctypes import * msvcrt = cdll.msvcrt str = "Huanhuan!" result = "Hello " + str + "\n" result = result.encode("utf-8") msvcrt.printf(result)
最后來搞定在IDLE中曲線顯示輸出結(jié)果的方法。
from ctypes import * msvcrt = cdll.msvcrt str = b"Huanhuan!" s = create_string_buffer(100) # 必須足夠長 msvcrt.sprintf(s, b'Hello %s\n', str) print(s.value.decode('utf-8'))
先使用sprintf函數(shù)把結(jié)果輸出到s變量,然后再用Python自帶的print方法輸出s的value。
好了,通過以上的各種方法就可以解決Py3K調(diào)用C函數(shù)printf的問題了。
什么?你問我為什么費這么大勁非要用printf輸出,而不是直接用Python自帶的print?
python的print和c的printf有什么區(qū)別
print([object, ...], *, sep=' ', end='\n', file=sys.stdout, flush=False)
輸出對象到流文件,sep指定分割符,end指定結(jié)束符。參數(shù)轉(zhuǎn)換為字符串寫入輸出流,如果沒有輸出內(nèi)容直接輸出end結(jié)束符。file參數(shù)必須是包含write方法的對象,默認輸出到標準輸出。
int printf( char * format, ... );
根據(jù)參數(shù) format 字符串來轉(zhuǎn)換并格式化數(shù)據(jù),然后將結(jié)果輸出到標準輸出設(shè)備(顯示器),直到出現(xiàn)字符串結(jié)束('\0')為止。
參數(shù) format 字符串可包含下列三種字符類型:
一般文本,將會直接輸出
ASCII 控制字符,如\t、\n 等有特定含義
格式轉(zhuǎn)換字符
格式轉(zhuǎn)換為一個百分比符號(%)及其后的格式字符所組成。一般而言,每個%符號在其后都必需有一個參數(shù)與之相呼應(yīng)(只有當%%轉(zhuǎn)換字符出現(xiàn)時會直接輸出%字符),而欲輸出的數(shù)據(jù)類型必須與其相對應(yīng)的轉(zhuǎn)換字符類型相同。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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