2011-06-28 50 views
1

我在自動生成一些C代碼,將其編譯到共享庫並將其加載到ctypes中,我很好奇,如果任何人都可以啓發我使用Python API的一部分可能需要的東西這樣的庫中(不創建一個完整的模塊)在Python中加載包含python API代碼的共享庫?

例如,我有一些快速代碼入侵一起:

PyObject* test() { 
    PyObject* to_ret = NULL; 
    PyGILState_STATE gstate = PyGILState_Ensure(); 

    to_ret = Py_BuildValue("i", 1+2); 

    PyGILState_Release(gstate); 

    return to_ret; 
} 

哪我編譯到一個.so和負載ctypes的。

然而,當我運行上面我得到:

>>> ctypes.CDLL("test.so").test() 
138145104 

所以我清楚地做錯事。任何想法/提示都會受到歡迎。

SOLUTION: 啊哈,上述的默認操作工作,但ctypes的需要int返回類型,所以是鑄造的PyObject *爲整數。看起來沒有辦法使用ctypes來返回一個任意的python對象,所以生成一個完整的模塊似乎是要走的路。

+0

好的,請逗我。如果你使用Python API,爲什麼你不想編寫一個模塊? –

+0

我只是玩弄一個庫,它可以讓你在C中編寫數字代碼的快速片段並將它們綁定到一個函數名。看起來很浪費,爲每個模塊構建一個模塊,並慢慢污染sys.modules。再加上它更像是一種挑戰。 = d –

回答

3

看來它可以在Python 2.7中完成,它支持將ctypes.py_object作爲類型。我從示例代碼構建了一個庫,並使用以下代碼:

Python 2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from ctypes import * 
>>> t = CDLL('test').test 
>>> t.restype = py_object 
>>> t() 
3