首頁  >  文章  >  後端開發  >  如何將 C 介面暴露給 Python 來實現?

如何將 C 介面暴露給 Python 來實現?

Barbara Streisand
Barbara Streisand原創
2024-11-06 02:19:02342瀏覽

How can I expose a C   interface to Python for implementation?

將C 介面公開給Python 進行實作

目標

將C 介面的Python 實作整合到現有的C 程式中,讓Python實現在更大的程式中無縫使用。

介面定義

考慮以下C 介面定義:

<code class="cpp">class myif {
public:
  virtual float myfunc(float a) = 0;
};</code>

在Python 中匯入和擴充介面

  1. 使用SWIG 啟用多態性:

    %module(directors="1") module
    
    %include "myif.h"
  2. 建立Python 實作:

    <code class="python">import module
    
    class MyCl(module.myif):
      def __init__(self):
        module.myif.__init__(self)
      def myfunc(self, a):
        return a * 2.0</code>

  1. <code class="cpp">Py_Initialize();</code>
  2. 在C 嵌入Python
    <code class="cpp">PyObject *module = PyImport_Import(PyString_FromString("mycl"));</code>
  3. 初始化Python (main.cc):

    <code class="cpp">PyObject *instance = PyRun_String("mycl.MyCl()", Py_eval_input, dict, dict);
    double ret = PyFloat_AsDouble(PyObject_CallMethod(instance, "myfunc", (char *)"(O)" ,PyFloat_FromDouble(input)));</code>
  4. <code class="cpp">Py_Finalize();</code>

    導入Python模組:
  1. swig -Wall -c++ -python -external-runtime runtime.h
  2. 建立實例並執行函數:
  3. g++ -DSWIG_TYPE_TABLE=myif -Wall -Wextra -shared -o _module.so myif_wrap.cxx -I/usr/include/python2.7 -lpython2.7
  4. <code class="cpp">myif *python2interface(PyObject *obj) {
      ...
    }</code>

<code class="cpp">int main() {
  ...
  myif *inst = python2interface(instance);
  std::cout << inst->myfunc(input) << std::endl;
  ...
}</code>

終結:

將Python 物件轉換為C 指標 🎜>重新編譯SWIG 模組:main.cc 中的最終實現按照以下步驟,可以成功實現Python 實現C 接口並將它們無縫整合到更大的C 程式中,提供更大的靈活性和可擴展性。

以上是如何將 C 介面暴露給 Python 來實現?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn