2013-06-28 46 views
1

我是python的新手,我試圖從python調用C函數並想要接收兩個變量。爲了保持它的簡單我顯示我的樣本代碼: Python,在python代碼中處理Py_buildValue

#include <Python.h> 
#include <stdio.h> 

PyObject* foo(char *p) 
{ 
    printf("%s\n", p); 
    return Py_BuildValue("ii", 2, 2); 

} 

>>> from ctypes import cdll 
>>> lib = cdll.LoadLibrary('./lib1.so') 
>>> d = lib.foo('hello') 
hello 
>>> d 
43128392 

爲什麼它不打印正確的價值觀?

彙編命令: GCC -c -IC:\ Python26 \包括1.C -o 1.O

GCC -shared -Wl,-soname,lib1.so -o lib1.so 1.O -LC:\ Python26 \ libs -LC:\ Python26 \ PCbuild -lpython26

+0

你爲什麼把它作爲一個C函數,而不是導入它作爲一個C擴展模塊的? – jfs

回答

2

默認情況下,​​希望函數返回int,並返回一個對象。你需要改變你的函數的返回:

from ctypes import cdll, py_object 
lib = cdll.LoadLibrary('./lib1.so') 

d = lib.foo('hello') 
print d      # prints address of object 

lib.foo.restype = py_object # change the result type 
d = lib.foo('hello') 
print d      # prints (2, 2) as expected 

您可以在這裏找到更多的信息:http://docs.python.org/2/library/ctypes.html#return-types

+0

如果這是你正在尋找的答案,你可能想要接受它;) – Guillaume