2016-06-14 3 views
0

コードでC関数を使用する方法を理解しようとしています。はるかに簡単な解決策は、​​を使用するように見えます。しかし、私はPythonにインポートするライブラリを作成した後何らかの理由で私は奇妙な動作を参照してください。詳細は以下の通りです。ここでPython、C、ctypesと変な文字

は、私がCコードのために持っているものです。

/* mymodule.c */ 
#include <stdio.h> 
#include "mymodule.h" 
void displayargs(int i, char c, char* s) { 
    (void)printf("i = %d, c = %c, s = %s\n", i, c, s); 
} 

/* mymodule.h */ 
void displayargs(int i, char c, char* s) 

私は、以下のコマンドを使用して、それからライブラリを構築:

私のPythonのテストコードは、この

#!/usr/bin/python 

# mymoduletest.py 
import ctypes 

mylib = ctypes.CDLL('./libmymodule.so') 
mylib.displayargs(10, 'c', "hello world!") 
のように見えます
gcc -Wall -fPIC -c mymodule.c 
gcc -shared -Wl,-soname,libmymodule.so.1 -o libmymodule.so mymodule.o 

./mymoduletest.pyを実行すると、

01が表示されます。
i = 10, c = c, s = hello world! 

は、しかし、私は文字がcの実際のchar値の代わりに表示されるのはなぜ

i = 10, c = �, s = hello world! 

を参照してください?

何か助けていただければ幸いです。

+0

Pythonに 'char'型がありますか?それとも単に 'c'の長さ1の文字列を渡すだけですか? – melpomene

+0

'mylib.displayargs(10,99、" hello world! ")'と呼ぶとどうなりますか? – melpomene

答えて

1

あなたが関数の引数を指定して、型を返す必要があります。

mylib.displayargs.argtypes = (ctypes.c_int, ctypes.c_char, ctypes.c_char_p) 
mylib.displayargs.restype = None # None means void here. 

あなたはタイプを指定しない場合、Pythonは推測している、とあなたは文字列を渡すとき、それは作るの推測がその関数でありますchar *が欲しい。

関連する問題