printf()
Linux の Python コマンドラインでC 関数を使用しようとしました。これを機能させるために、 をインポートしましたctypes
。問題は、 のオブジェクトを作成してループで - 関数CDLL
を使用するとprintf()
、非常に奇妙な出力が得られることです。
>>> import ctypes
>>> libc = ctypes.CDLL("libc.so.6")
>>> for i in range(10):
... libc.printf("%d", i)
...
01
11
21
31
41
51
61
71
81
91
>>>
ただし、関数内でこのループを呼び出すと、期待どおりに動作します。
>>> import ctypes
>>> libc = ctypes.CDLL("libc.so.6")
>>> def pr():
... for i in range(10):
... libc.printf("%d", i)
... libc.printf("\n")
...
>>> pr()
0123456789
>>>
この動作の原因が何なのかは推測できません...
問題があれば、Linux で Python 2.7.6 を使用しています。
編集:
Python のバージョンやオペレーティング システムはこれに影響を与えません。詳細については、以下の PM 2Ring の回答を参照してください。Windows では、 の初期化をlibc
に変更するだけで済みますlibc = ctypes.CDLL("msvcrt.dll")
( は.dll
オプションです)。関数を呼び出す以外に正しい出力を得るための別の方法は、 の戻り値をprintf()
変数に格納することです。
>>> import ctypes
>>> libc = ctypes.CDLL("libc.so.6") # "mscvrt.dll" on windows
>>> for i in range(10):
... r = libc.printf("%d", i)
...
0123456789>>>
終了時の改行を簡単に追加できるため、私は依然としてこの機能を好みます。
ベストアンサー1
'1'
各数値の末尾にある余分な はからの戻り値でありprintf
、出力される文字数を返します。対話型インタープリタで呼び出された関数の戻り値は自動的に出力されます ( でない限りNone
)。
実際、対話型インタープリタは、None
割り当てられていない式以外のすべてを出力します。そしてもちろん、それらの式に改行が追加されます。これが、最初のコード ブロックの出力が別々の行にある理由です。
関数pr
には return ステートメントがないので、 が返されNone
、余分なものは印刷されません。