1.ctypes能夠呼叫動態鏈結庫中的函式,同時建立各種複雜的c資料型別和底層操作函式。
2.使用動態鏈結庫,在windows上叫做dynamic link libraries(dll)動態鏈結庫,在linux上叫做shared objects(so)共享庫。
3.ctypes提供了三種方法呼叫dll:cdll(),windll(),和oledll()。他們之間的不同在於函式的呼叫方法和返回值。
cdll()載入的庫,其匯出的函式必須使用標準的cdecl呼叫約定;windll()方法載入的庫,其匯出的函式必須使用stdcall呼叫約定;oledll()方法和windll()類似,不過若果函式返回乙個hresult錯誤**,可以使用com函式得到具體的錯誤資訊。
舉例:使用cdll.msvcrt即可呼叫ms標準的c庫msvcrt,msvcrt包含了大部分標準c函式。
下面來看一下簡單的printf函式。
[html]view plain
copy
from ctypes import *
msvcrt
= cdll
.msvcrt
str=
"huanhuan!"
msvcrt.printf("hello %s\n", str)
這樣就可以使用c語言中的printf函式進行輸出。
如果在idle裡執行的話會發現程式沒有任何輸出結果,這是因為printf是列印到真實的標準輸出,而不是sys.stdout。如
果想要看到執行結果,可以在cmd裡執行python test.py來檢視結果,前提是已經設定好了python的環境變數。或者有乙個曲線方法可以在idle中顯示輸出結果,請曲線閱讀到文章最後。
如果使用的是py3k,在控制台裡會看到只有開頭字元h被輸出了。因為py3k使用的是unicode編碼,而printf不支援該編碼,所以需要轉碼。整理出來三種改寫方法可以解決這一問題。
[python]view plain
copy
# a 轉為byte型別 在字串前面加b
from
ctypes
import
* msvcrt = cdll.msvcrt
str = b"huanhuan!"
msvcrt.printf(b"hello %s\n"
, str)
驗證成功
[python]view plain
copy
# b 使用wprintf寬字元顯示
from
ctypes
import
* msvcrt = cdll.msvcrt
str = "huanhuan!"
msvcrt.wprintf("hello %s\n"
, str)
驗證成功
[python]view plain
copy
# c 轉碼為utf-8
from
ctypes
import
* msvcrt = cdll.msvcrt
str = "huanhuan!"
result = "hello "
+ str +
"\n"
result = result.encode("utf-8"
) msvcrt.printf(result)
驗證成功
最後來搞定在idle中曲線顯示輸出結果的方法。
[python]view plain
copy
from
ctypes
import
* msvcrt = cdll.msvcrt
str = b"huanhuan!"
s = create_string_buffer(100
)
# 必須足夠長
msvcrt.sprintf(s, b'hello %s\n'
, str)
(s.value.decode(
'utf-8'
))
驗證成功
先使用sprintf函式把結果輸出到s變數,然後再用python自帶的print方法輸出s的value。
好了,通過以上的各種方法就可以解決py3k呼叫c函式printf的問題了。
什麼?你問我為什麼費這麼大勁非要用printf輸出,而不是直接用python自帶的print?
給我出去站著去!
我樂意!
Trac 基本功能介紹
trac 搭配 svn 來使用,覺得需要的功能都有了 含括 檔案,時間軸追蹤,產品路線圖,瀏覽原始碼,新增 檢視待辦事項,搜尋 等 來簡單介紹一下 trac吧 trac 官方 the trac project trac 說明 the trac user and administration guid...
torch基本功能介紹
torch 張量的相關運算,eg 建立 索引 切片 連續 轉置 加減乘除等相關運算。torch.nn 包含搭建網路層的模組 modules 和一系列的loss函式。eg.全連線 卷積 池化 bn分批處理 dropout crossentropyloss msloss等。torch.autograd ...
RaceWeb介紹 1 基本功能
raceweb軟體主要用於對資料進行快速操作及 web展示。資料庫目前可以使用 firebird sqlite sqlserver oracle 未來將設定為支援所有常見資料庫型別。web伺服器使用 apache 軟體的另乙個目標是快速,即以最少的操作達到資料操作的目的。raceweb目前在wind...