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

首頁 > 編程 > Python > 正文

Python調用ctypes使用C函數printf的方法

2020-01-04 16:48:57
字體:
來源:轉載
供稿:網友

在Python程序中導入ctypes模塊,載入動態鏈接庫。動態鏈接庫有三種:cdll以及windows下的windll和oledll,cdll載入導出函數使用標準的cdecl調用規范的庫,而windll載入導出函數符合stdcall調用規范(Win32 API的原生約定)的庫,oledll也使用stdcall調用規范,并假設函數返回Windows的HRESULT錯誤代碼。錯誤代碼用于在出錯時自動拋出WindowsError這個Python異常,可以使用COM函數得到具體的錯誤信息。

使用cdll.msvcrt即可調用MS標準的C庫msvcrt,msvcrt包含了大部分標準C函數。

下面來看一下簡單的printf函數。

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

這樣就可以使用C語言中的printf函數進行輸出。
如果在IDLE里運行的話會發現程序沒有任何輸出結果,這是因為printf是打印到真實的標準輸出,而不是sys.stdout。如果想要看到運行結果,可以在CMD里運行python test.py來查看結果,前提是已經設置好了Python的環境變量。或者有一個曲線方法可以在IDLE中顯示輸出結果,請曲線閱讀到文章最后。

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

# A 轉為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 轉碼為utf-8from ctypes import *msvcrt = cdll.msvcrtstr = "Huanhuan!"result = "Hello " + str + "/n"result = result.encode("utf-8")msvcrt.printf(result)

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

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函數把結果輸出到s變量,然后再用Python自帶的print方法輸出s的value。

好了,通過以上的各種方法就可以解決Py3K調用C函數printf的問題了。

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

python的print和c的printf有什么區別

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

輸出對象到流文件,sep指定分割符,end指定結束符。參數轉換為字符串寫入輸出流,如果沒有輸出內容直接輸出end結束符。file參數必須是包含write方法的對象,默認輸出到標準輸出。

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

根據參數 format 字符串來轉換并格式化數據,然后將結果輸出到標準輸出設備(顯示器),直到出現字符串結束('/0')為止。
參數 format 字符串可包含下列三種字符類型:

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

格式轉換為一個百分比符號(%)及其后的格式字符所組成。一般而言,每個%符號在其后都必需有一個參數與之相呼應(只有當%%轉換字符出現時會直接輸出%字符),而欲輸出的數據類型必須與其相對應的轉換字符類型相同。

 
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 都江堰市| 洞口县| 临汾市| 舞阳县| 光泽县| 沐川县| 石狮市| 老河口市| 多伦县| 阜宁县| 吴堡县| 揭西县| 舞钢市| 定远县| 七台河市| 桑日县| 连云港市| 蓬溪县| 牙克石市| 沂水县| 察雅县| 当雄县| 博野县| 涟水县| 乌兰浩特市| 仁寿县| 建阳市| 黄大仙区| 莫力| 合川市| 灯塔市| 洱源县| 章丘市| 安图县| 措勤县| 涿州市| 铜鼓县| 东兰县| 简阳市| 嵊泗县| 景谷|