欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

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

系統(tǒng) 1906 0

在Python程序中導(dǎo)入ctypes模塊,載入動(dòng)態(tài)鏈接庫(kù)。動(dòng)態(tài)鏈接庫(kù)有三種:cdll以及windows下的windll和oledll,cdll載入導(dǎo)出函數(shù)使用標(biāo)準(zhǔn)的cdecl調(diào)用規(guī)范的庫(kù),而windll載入導(dǎo)出函數(shù)符合stdcall調(diào)用規(guī)范(Win32 API的原生約定)的庫(kù),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庫(kù)msvcrt,msvcrt包含了大部分標(biāo)準(zhǔn)C函數(shù)。

下面來(lái)看一下簡(jiǎn)單的printf函數(shù)。

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

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

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

            
# A 轉(zhuǎn)為byte類(lèi)型 在字符串前面加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)
          

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

            
from ctypes import *
msvcrt = cdll.msvcrt
str = b"Huanhuan!"
s = create_string_buffer(100)  # 必須足夠長(zhǎng)
msvcrt.sprintf(s, b'Hello %s\n', str)
print(s.value.decode('utf-8'))
          

先使用sprintf函數(shù)把結(jié)果輸出到s變量,然后再用Python自帶的print方法輸出s的value。

好了,通過(guò)以上的各種方法就可以解決Py3K調(diào)用C函數(shù)printf的問(wèn)題了。

什么?你問(wèn)我為什么費(fèi)這么大勁非要用printf輸出,而不是直接用Python自帶的print?

python的print和c的printf有什么區(qū)別

print([object, ...], *, sep=' ', end='\n', file=sys.stdout, flush=False)

輸出對(duì)象到流文件,sep指定分割符,end指定結(jié)束符。參數(shù)轉(zhuǎn)換為字符串寫(xiě)入輸出流,如果沒(méi)有輸出內(nèi)容直接輸出end結(jié)束符。file參數(shù)必須是包含write方法的對(duì)象,默認(rèn)輸出到標(biāo)準(zhǔn)輸出。

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

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

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

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


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 日本黄大片视频在线播放 | 亚洲视频观看 | 日韩国产欧美在线观看一区二区 | 国产精品久久av | 99热久久这里只有精品2010 | 免费看h网站 | 国产精品久久久久久久午夜 | www国产精品 | 看毛片免费 | 亚洲一卡二卡在线 | 欧美日本一道高清二区三区 | 国产女人与拘做受视频 | 国产精品一区二区三区四区 | 久久精品一区二区三区四区 | 黄网免费看 | 国产精品久久久久一区二区 | 亚洲欧美综合人成野草 | 精品国产一区二区三区免费 | 性色欧美 | 一区二区三区视频在线 | 99久久精品费精品国产一区二 | 欧美精品99毛片免费高清观看 | 久久综合色之久久综合 | 在线观看av片 | 91成人午夜性a一级毛片 | 唐人社电亚洲一区二区三区 | 成人免费大片黄在线播放 | 亚州精品天堂中文字幕 | 色婷婷av久久久久久久 | 成人精品一区二区三区校园激情 | 欧美顶级毛片在线播放 | 久久久精品一区二区三区 | 国产一极毛片 | 91伦理片 | 久久精品亚洲 | 精品国产影院 | 成人欧美一区二区三区在线播放 | 91在线播放网站 | 成人av观看 | 国产高清一区二区三区 | 欧美精品第三页 |