国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python調(diào)用ctypes使用C函數(shù)printf的方法

2019-11-25 15:54:29
字體:
供稿:網(wǎng)友

在Python程序中導(dǎo)入ctypes模塊,載入動(dòng)態(tài)鏈接庫。動(dòng)態(tài)鏈接庫有三種:cdll以及windows下的windll和oledll,cdll載入導(dǎo)出函數(shù)使用標(biāo)準(zhǔn)的cdecl調(diào)用規(guī)范的庫,而windll載入導(dǎo)出函數(shù)符合stdcall調(diào)用規(guī)范(Win32 API的原生約定)的庫,oledll也使用stdcall調(diào)用規(guī)范,并假設(shè)函數(shù)返回Windows的HRESULT錯(cuò)誤代碼。錯(cuò)誤代碼用于在出錯(cuò)時(shí)自動(dòng)拋出WindowsError這個(gè)Python異常,可以使用COM函數(shù)得到具體的錯(cuò)誤信息。

使用cdll.msvcrt即可調(diào)用MS標(biāo)準(zhǔn)的C庫msvcrt,msvcrt包含了大部分標(biāo)準(zhǔn)C函數(shù)。

下面來看一下簡單的printf函數(shù)。

from ctypes import *msvcrt = cdll.msvcrtstr = "Huanhuan!"msvcrt.printf("Hello %s/n", str)

這樣就可以使用C語言中的printf函數(shù)進(jìn)行輸出。
如果在IDLE里運(yùn)行的話會發(fā)現(xiàn)程序沒有任何輸出結(jié)果,這是因?yàn)閜rintf是打印到真實(shí)的標(biāo)準(zhǔn)輸出,而不是sys.stdout。如果想要看到運(yùn)行結(jié)果,可以在CMD里運(yùn)行python test.py來查看結(jié)果,前提是已經(jīng)設(shè)置好了Python的環(huán)境變量。或者有一個(gè)曲線方法可以在IDLE中顯示輸出結(jié)果,請曲線閱讀到文章最后。

如果使用的是Py3K,在控制臺里會看到只有開頭字符H被輸出了。因?yàn)镻y3K使用的是Unicode編碼,而printf不支持該編碼,所以需要轉(zhuǎn)碼。整理出來三種改寫方法可以解決這一問題。

# A 轉(zhuǎn)為byte類型 在字符串前面加bfrom ctypes import *msvcrt = cdll.msvcrtstr = b"Huanhuan!"msvcrt.printf(b"Hello %s/n", str)# B 使用wprintf寬字符顯示from ctypes import *msvcrt = cdll.msvcrtstr = "Huanhuan!"msvcrt.wprintf("Hello %s/n", str)# C 轉(zhuǎn)碼為utf-8from ctypes import *msvcrt = cdll.msvcrtstr = "Huanhuan!"result = "Hello " + str + "/n"result = result.encode("utf-8")msvcrt.printf(result)

最后來搞定在IDLE中曲線顯示輸出結(jié)果的方法。

from ctypes import *msvcrt = cdll.msvcrtstr = 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的問題了。

什么?你問我為什么費(fèi)這么大勁非要用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方法的對象,默認(rèn)輸出到標(biāo)準(zhǔn)輸出。

int printf( char * format, ... );

根據(jù)參數(shù) format 字符串來轉(zhuǎn)換并格式化數(shù)據(jù),然后將結(jié)果輸出到標(biāo)準(zhǔn)輸出設(shè)備(顯示器),直到出現(xiàn)字符串結(jié)束('/0')為止。
參數(shù) format 字符串可包含下列三種字符類型:

一般文本,將會直接輸出
ASCII 控制字符,如/t、/n 等有特定含義
格式轉(zhuǎn)換字符

格式轉(zhuǎn)換為一個(gè)百分比符號(%)及其后的格式字符所組成。一般而言,每個(gè)%符號在其后都必需有一個(gè)參數(shù)與之相呼應(yīng)(只有當(dāng)%%轉(zhuǎn)換字符出現(xiàn)時(shí)會直接輸出%字符),而欲輸出的數(shù)據(jù)類型必須與其相對應(yīng)的轉(zhuǎn)換字符類型相同。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 承德县| 深圳市| 神木县| 康乐县| 迁安市| 广元市| 伊通| 搜索| 五常市| 台湾省| 客服| 温宿县| 镇江市| 孝义市| 南宁市| 上栗县| 阿尔山市| 依兰县| 汉中市| 河源市| 定兴县| 万全县| 蚌埠市| 南华县| 黄浦区| 古浪县| 雷州市| 元氏县| 桐乡市| 寻乌县| 襄城县| 寻乌县| 武义县| 通河县| 大港区| 沙田区| 桂林市| 武穴市| 陕西省| 洛南县| 包头市|