簡體   English   中英

如何從C++撥打Python?

[英]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 調用)。

我不知道它是否回答了你的問題(從你的標題我知道你想從 c++ 端調用 python function ,但后來你似乎專門詢問cpppy )但你可以用pybind11進行綁定。 這個 package 被大量使用,並且在很多情況下被用作swig的替代品(要了解差異,請查看 TensorFlow 社區中的這個開放線程)。 這是 Python-C++ 綁定最常用的兩個包。

要了解如何在 C++ 中為 Pybind11 調用 python function,請查看此問題,而要了解如何在 C++ 中為 swig 調用 python function,請查看此問題。請查看

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM