ctypes
はたくさんのCと互換性のあるデータ型を定義しています :
ctypesの型 | Cの型 | Pythonの型 |
---|---|---|
c_char |
char
|
1文字の 文字列 |
c_wchar |
wchar_t
|
1文字の ユニコード文字列 |
c_byte |
char
|
整数/長整数 |
c_ubyte |
unsigned char
|
整数/長整数 |
c_short |
short
|
整数/長整数 |
c_ushort |
unsigned short
|
整数/長整数 |
c_int |
int
|
整数/長整数 |
c_uint |
unsigned int
|
整数/長整数 |
c_long |
long
|
整数/長整数 |
c_ulong |
unsigned long
|
整数/長整数 |
c_longlong |
__int64 or
long long
|
整数/長整数 |
c_ulonglong |
unsigned __int64 or
unsigned long long
|
整数/長整数 |
c_float |
float
|
浮動小数点数 |
c_double |
double
|
浮動小数点数 |
c_char_p |
char *
(NUL 終端)
|
文字列または
None
|
c_wchar_p |
wchar_t *
(NUL 終端)
|
ユニコードまたは
None
|
c_void_p |
void *
|
整数/長整数
またはNone
|
これら全ての型はその型を呼び出すことによって作成でき、オプションとして型と値が合っている 初期化子を指定することができます:
>>> c_int() c_long(0) >>> c_char_p("Hello, World") c_char_p('Hello, World') >>> c_ushort(-3) c_ushort(65533) >>>
これらの型は変更可能であり、値を後で変更することもできます:
>>> i = c_int(42) >>> print i c_long(42) >>> print i.value 42 >>> i.value = -99 >>> print i.value -99 >>>
新しい値をポインタ型c_char_p、c_wchar_p、 およびc_void_pのインスタンスへ代入すると、 メモリブロックの内容ではなく指しているメモリ位置が変わります、 (もちろんできません。なぜなら、Python文字列は変更不可能だからです):
>>> s = "Hello, World" >>> c_s = c_char_p(s) >>> print c_s c_char_p('Hello, World') >>> c_s.value = "Hi, there" >>> print c_s c_char_p('Hi, there') >>> print s # 最初の文字列は変更されていない Hello, World >>>
しかし、変更可能なメモリを指すポインタであることを想定している関数へ
それらを渡さないように注意すべきです。もし変更可能なメモリブロックが必要なら、
ctypesにはcreate_string_buffer
関数があり、いろいろな方法で作成する
ことできます。
現在のメモリブロックの内容はraw
プロパティを使ってアクセス
(あるいは変更)することができます。もし現在のメモリブロックにNUL終端文字列として
アクセスしたいなら、value
プロパティを使ってください:
>>> from ctypes import * >>> p = create_string_buffer(3) # 3バイトのバッファを作成、NULで初期化される >>> print sizeof(p), repr(p.raw) 3 '\x00\x00\x00' >>> p = create_string_buffer("Hello") # NUL終端文字列を含むバッファを作成 >>> print sizeof(p), repr(p.raw) 6 'Hello\x00' >>> print repr(p.value) 'Hello' >>> p = create_string_buffer("Hello", 10) # 10バイトのバッファを作成 >>> print sizeof(p), repr(p.raw) 10 'Hello\x00\x00\x00\x00\x00' >>> p.value = "Hi" >>> print sizeof(p), repr(p.raw) 10 'Hi\x00lo\x00\x00\x00\x00\x00' >>>
create_string_buffer
関数は初期のctypesリリースにあったc_string
関数
だけでなく、(エイリアスとしてはまだ利用できる)c_buffer
関数をも置き換えるものです。
Cの型wchar_t
のユニコード文字を含む変更可能なメモリブロックを作成するには、
create_unicode_buffer
関数を使ってください。
ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。