欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2017年08月23日 17:11:56   投稿:mdxy-dxy  
這篇文章主要介紹了Python調用ctypes使用C函數printf,需要的朋友可以參考下

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

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

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

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

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

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

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

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

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

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

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

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

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 等有特定含義
格式轉換字符

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

相關文章

  • Python 中判斷列表是否為空的方法

    Python 中判斷列表是否為空的方法

    這篇文章主要介紹了Python 中判斷列表是否為空的方法,本文通過代碼詳解的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-11-11
  • Pygame實戰(zhàn)之檢測按鍵正確的小游戲

    Pygame實戰(zhàn)之檢測按鍵正確的小游戲

    這篇文章主要為大家介紹了利用Pygame模塊實現的檢測按鍵正確的小游戲:每個字母有10秒的按鍵時間,如果按對,則隨機產生新的字符,一共60s,如果時間到了,則游戲結束??靵砀S小編一起學習一下吧
    2021-12-12
  • Python的gevent框架的入門教程

    Python的gevent框架的入門教程

    這篇文章主要介紹了Python的gevent框架的入門教程,示例代碼基于Python2.x版本,需要的朋友可以參考下
    2015-04-04
  • Python中asyncore的用法實例

    Python中asyncore的用法實例

    這篇文章主要介紹了Python中asyncore的用法,asyncore提供了方便的網絡操作方法,本文以連接并解析www.python.org主頁為例加以說明,需要的朋友可以參考下
    2014-09-09
  • Python編程scoketServer實現多線程同步實例代碼

    Python編程scoketServer實現多線程同步實例代碼

    這篇文章主要介紹了Python編程scoketServer實現多線程同步實例代碼,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • Python操作word實現添加文字或圖片水印

    Python操作word實現添加文字或圖片水印

    這篇文章主要為大家詳細介紹了如何使用Spire.Doc for Python在程序中的輕松添加文字和圖像水印到Word文檔,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-10-10
  • python實現的一個火車票轉讓信息采集器

    python實現的一個火車票轉讓信息采集器

    這篇文章主要介紹了python實現的一個火車票轉讓信息采集器,采集信息來源是58同程或者趕集網,需要的朋友可以參考下
    2014-07-07
  • 利用Python編寫一個簡單的緩存系統

    利用Python編寫一個簡單的緩存系統

    今天來做一個最簡單的例子,利用寫一個最簡單的緩存系統,以key``value的方式保持數據,并且需要將內容中的數據落地到文件,以便下次啟動的時候,將文件的內容加載進內存中來,感興趣的可以了解一下
    2023-04-04
  • python光學仿真實現光線追跡折射與反射的實現

    python光學仿真實現光線追跡折射與反射的實現

    這篇文章主要為大家介紹了python光學仿真實現光線追跡折射與反射的實現示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2021-10-10
  • python中執(zhí)行shell的兩種方法總結

    python中執(zhí)行shell的兩種方法總結

    這篇文章主要介紹了python中執(zhí)行shell的兩種方法,有兩種方法可以在Python中執(zhí)行SHELL程序,方法一是使用Python的commands包,方法二則是使用subprocess包,這兩個包均是Python現有的內置模塊。需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-01-01

最新評論