[英]How to call Python from C++?
從文檔:
cppyy 是一個自動的、運行時的 Python-C++ 綁定生成器,用於從 Python 調用 C++和從 C++ 調用 Python 。
(強調我的)
但是,我沒有看到執行相同操作的任何說明,因此是否可以使用 cppyy 通過 C++ 調用cppyy
?
作為限定符,因為我不知道你從哪里獲得 cppyy,當時輸入該句子的主要代碼不存在於 cppyy master 中,但存在於其歷史悠久的 PyROOT 中。 這個所謂的“類生成器”插件允許 Cling 將 Python 個類“看”為 C++ 個類,用於直接回調,甚至是 Python 個類中的 inheritance 個。 有關一些示例,請參閱此出版物(第 3 頁): https://www.researchgate.net/publication/288021806_Python_in_the_Cling_World
此代碼未移植到 cppyy standalone b/c class 生成器依賴於交互式使用(特別是動態范圍),因此僅適用於 Cling,而不是編譯代碼,並且(目前)無法進入 Cling 提示來自 Python(反之亦然)。
即使沒有 class 生成器,這句話仍然存在的原因是 cppyy 從那以后發展了許多其他方式來從 C++ 調用 Python(這些已經被反向移植到 PyROOT 中)。 示例包括 C 風格的 function 指針、C++ std::function<>
對象、lambda 和跨語言 inheritance。此外,這些都可以通過將 cppyy 導入嵌入式 Python 來使用(因此可以從編譯的 C++ 中使用)。
請參閱文檔中的這些示例:回調和交叉繼承。 交叉繼承可能是最容易使用的:只需定義一個抽象接口,在 Python 中實現它,將指針傳遞給 C++ 並像使用 C++ 中的任何指向接口的指針一樣使用它。對於回調,聲明一個 extern function 指針(或std::function
對象)在 header 中,將其傳遞到嵌入式 Python 中的cppyy.include
中,將 Python function 分配給該指針,然后根據需要在 C++ 中調用它。
回調可以做得非常復雜,假設 C++ 端可以處理它。 例如,通過在Python端提供注解,Python函數可以實例化C++ function指針模板。 采用下面 C++ 中的完全通用回調,它接受任何 arguments 並產生任何結果:
>>> import cppyy
>>> cppyy.cppdef("""\
... template<typename R, typename... U, typename... A>
... R callT(R(*f)(U...), A&&... a) {
... return f(a...);
... }""")
True
>>> def f(a: 'int') -> 'double':
... return 3.1415*a
...
>>> cppyy.gbl.callT(f, 2)
6.283
>>> def f(a: 'int', b: 'int') -> 'int':
... return 3*a*b
...
>>> cppyy.gbl.callT(f, 6, 7)
126
>>>
從 C++ 調用到 Python 的最終方法確實沒有記錄 b/c 它(仍然)僅適用於 CPython/cppyy,不適用於 PyPy/_cppyy,並且命名也是特定於實現的: CPyCppyy/API.h 。
此 header 旨在包含在 C++ 代碼中,允許對來自 C++ 的 cppyy 綁定實例進行裝箱和拆箱、自定義轉換器和執行程序、memory 管理以及存根函數的參數打包。 還有一些處理一次性事件的便利函數。 例如:
import cppyy
def pyfunc():
return 42
cppyy.cppdef("""\
#include "CPyCppyy/API.h"
int cppfunc() {
return (int)CPyCppyy::Eval("pyfunc()");
}""")
print(cppyy.gbl.cppfunc())
(雖然這里的例子為了方便起見是從 Python 運行的,但也可以從編譯后的 C++ 中的嵌入式 Python 調用)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.