2015-12-21 54 views
2

可以使用新的extern「Python」風格cffi回調嵌入PyPy嗎? PyPy的文檔只顯示舊式cffi回調,但cffi文檔建議不要使用它們。 PyPy文檔沒有提及新的樣式回調,我無法獲得新的樣式回調。當運行編譯的C使用帶有嵌入式PyPy的extern「Python」風格cffi回調

Embedding PyPy

Extern 「Python」 (new-style callbacks)

# file "interface.py" 

import cffi 

# add new extern "Python" declaration 
ffi = cffi.FFI() ffi.cdef(''' 
struct API { 
    double (*add_numbers)(double x, double y); 

    extern "Python" void add_numbers2(double, double); 
}; ''') 

# Better define callbacks at module scope, it's important to 
# keep this object alive. 
@ffi.callback("double (double, double)") 
def add_numbers(x, y): 
    return x + y 

# new function 
@ffi.def_extern() 
def add_numbers2(x, y): 
    return x + y 


def fill_api(ptr): 
    global api 
    api = ffi.cast("struct API*", ptr) 
    api.add_numbers = add_numbers 

錯誤(來源C是相同PyPy文檔):

debug: OperationError: 
debug: operator-type: CDefError 
debug: operator-value: cannot parse "extern "Python" void add_numbers2(double, double);" 
:6:5: before: extern 
Error calling pypy_execute_source_ptr! 
+0

的確,我們需要檢查嵌入文檔。請注意,「embedding-using-extern-Python」的全部功能仍在開發中。同時,請注意,在「struct API」中使用「extern Python」是沒有意義的。 –

回答

2

「外部蟒」 是不是真的意味着是使用現在嵌入像你指向的那種情況。爲了很好地支持這種情況,cffi的開發者(包括我:-)需要更多的努力。換句話說,未來的cffi版本應該提供另一種嵌入方式,比CPython和PyPy的定製解決方案(分別爲「使用CPython C API」和「遵循https://pypy.readthedocs.org/en/latest/embedding.html」)更簡單。它也應該提供一個共同的解決方案。但是,現在它沒有完成。

您可以在PyPy文檔的示例之上應用現有的(cffi 1.4)「extern Python」解決方案,但它需要一些重構---特別是,該示例使用「內聯ABI模式」,而「 extern Python「僅適用於」非線性API模式「。如果我們認爲https://pypy.readthedocs.org/en/latest/embedding.html描述純粹的ABI模式方法,那麼使用ffi.callback()仍然是記錄在CFFI中的唯一方法。

更新: CFFI 1.5完全支持以「extern Python」風格嵌入(http://cffi.readthedocs.org/en/latest/embedding.html)。它現在可在CPython上使用。 PyPy需要中繼版本(或PyPy 4.1,它應該在2016年3月或4月)。

+0

你好,很高興有一個cffi開關。哦,我看到文檔已更新,謝謝!那麼現在是否有可能在PyPy嵌入中使用「extern Python」解決方案和「非線性API模式」? – Praxeolitic

+0

是的,使用類似https://bpaste.net/show/ee8f2d365248(未測試!)。手動運行_interface_build.py以創建_interface_cffi.so。 –

+0

@ArminRigo這個答案仍然反映CFFI 1.5發佈後的現狀嗎? – astrojuanlu

相關問題