」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 如何將 C++ 介面公開給 Python 來實作?

如何將 C++ 介面公開給 Python 來實作?

發佈於2024-11-19
瀏覽:386

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

向Python 公開C 介面以進行實作

目標

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

介面定義

考慮以下 C 介面定義:

class myif {
public:
  virtual float myfunc(float a) = 0;
};

在Python 中導入和擴展接口

  1. 使用SWIG 啟用多態性:

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

    import module
    
    class MyCl(module.myif):
      def __init__(self):
        module.myif.__init__(self)
      def myfunc(self, a):
        return a * 2.0

在C 中嵌入Python

  1. 在C 中嵌入Python

    Py_Initialize();
    初始化Python (main.cc):
  2. Py_Initialize();

    Py_Initialize();
    導入Python模組:
  3. PyObject *module = PyImport_Import(Py&]PyObject *module = PyImport_Import(PyObjectd mycl"));

    Py_Initialize();
  4. 建立實例並執行函數:
  5. PyObject *instance = PyRun_String("mycl.MyCl() 「,Py_eval_input,字典,字典); double ret = PyFloat_AsDouble(PyObject_CallMethod(instance, "myfunc", (char *)"(O)" ,PyFloat_FromDouble(input)));

    Py_Initialize();
  6. 最終化:
]

    Py_Finalize();
  1. 將Python 物件轉換為C 指標

    swig -Wall -c   -python -external-runtime runtime.h
  2. SWIG 運行時:

    swig -Wall -c -python -external-runtime runtime.h

    swig -Wall -c   -python -external-runtime runtime.h
  3. 重新編譯SWIG 模組:

    g -DSWIG_TYPE_TABLE=myif -Wall -Wextra -shared -o _module.rap myifsrap. cxx -I/usr/include/python2.7 -lpython2.7

    Py_Initialize();
  4. 助手轉換函數:

int main() {
  ...
  myif *inst = python2interface(instance);
  std::cout myfunc(input) 

main.cc 中的最終實作

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

int main() { …… myif *inst = python2interface(實例); std::cout myfunc(input) 透過遵循這些步驟,人們可以成功實現 C 介面的 Python 實現,並將其無縫整合到更大的 C 程式中,從而提供更大的靈活性和可擴展性。

最新教學 更多>
  • 異步AJAX請求時如何顯示載入圖片?
    異步AJAX請求時如何顯示載入圖片?
    在非同步請求期間顯示載入影像使用$.ajax 執行非同步請求可能會因為缺乏可見的指示而導致混亂正在進行的過程。本文探討了在此類請求期間顯示載入影像的技術。 首先,提供的程式碼片段對 URL 執行非同步請求,並將接收到的 HTML 附加到類別為「info」的元素。若要顯示載入影像,可以使用 '...
    程式設計 發佈於2024-11-19
  • 代碼氣味 - 語言混亂
    代碼氣味 - 語言混亂
    過於複雜的命名會導致混亂 TL;DR:命名很難,不要因為不必要的意外複雜性而讓它變得更難。 問題 不清晰、誤導性、含糊和不明確的名稱 冗餘術語 令人困惑的抽象 隱密縮寫 解決方案 簡化命名約定 確保一致性 避免不必要的行話 根據行為使用描述性名稱 保持術語一致 ...
    程式設計 發佈於2024-11-19
  • 如何從 MySQL 轉儲中刪除 DEFINER 子句:增強備份安全性和可移植性指南
    如何從 MySQL 轉儲中刪除 DEFINER 子句:增強備份安全性和可移植性指南
    從MySQL 轉儲中刪除DEFINER 子句從MySQL 轉儲中刪除DEFINER 子句MySQL 轉儲可能包含DEFINER 子句,它指定建立要轉儲的資料庫對象的使用者和主機。將轉儲匯入到不同環境時,這些子句可能會造成安全性問題或導致衝突。 為了緩解這些問題,通常需要從轉儲檔案中刪除 DEFINE...
    程式設計 發佈於2024-11-19
  • 儘管程式碼有效,為什麼 POST 請求無法擷取 PHP 中的輸入?
    儘管程式碼有效,為什麼 POST 請求無法擷取 PHP 中的輸入?
    解決PHP 中的POST 請求故障在提供的程式碼片段中:action=''而非:action="<?php echo $_SERVER['PHP_SELF'];?>";?>"檢查$_POST陣列:表單提交後使用 var_dump 檢查 $_POST 陣列的內...
    程式設計 發佈於2024-11-19
  • 為什麼編譯器優化 lambda 函數比傳統函數更有效?
    為什麼編譯器優化 lambda 函數比傳統函數更有效?
    Lambda 優化和內聯函數:編譯器的優勢Nicolai Josuttis 的聲明(與普通函數相比,lambda 表現出卓越的編譯器優化)引起了許多人的興趣開發人員。透過調查這項說法,我們試圖揭示這種優化優勢背後的根本原因。 函數物件和內聯作為函數物件的Lambda 擁有一個關鍵優勢:將它們傳遞給函...
    程式設計 發佈於2024-11-19
  • Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta:列偏移的刪除和恢復Bootstrap 4 在其Beta 1 版本中引入了重大更改柱子偏移了。然而,隨著 Beta 2 的後續發布,這些變化已經逆轉。 從 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    程式設計 發佈於2024-11-19
  • PHP 的 time() 函數傳回與時區無關的時間戳記嗎?
    PHP 的 time() 函數傳回與時區無關的時間戳記嗎?
    PHP time() 傳回與時區無關的時間戳記嗎? 處理時間計算時,了解以下內容的上下文非常重要時間戳以及時區如何影響它。 PHP 的 time() 函數提供了時間戳記值,但其時區意義需要澄清。 GMT/UTC 時間戳UTC(協調世界時)和 GMT(格林威治)平均時間)是用作測量世界時間基礎的時區。...
    程式設計 發佈於2024-11-19
  • 如何有效率地檢索 Go 字串的最後一個字元?
    如何有效率地檢索 Go 字串的最後一個字元?
    檢索Go 字符串的最後一個字符在Go 中,處理字符串時會出現一個常見的需求:從Go 字符串中檢索最後X 個字元給定的字串。雖然 string 套件沒有為此任務提供特定函數,但有一些有效的方法可以使用切片表達式來完成此任務。 要取得字串的最後 N 個字符,請使用以下切片表達式語法:stringVari...
    程式設計 發佈於2024-11-19
  • 渲染後如何在 React 中聚焦輸入欄位?
    渲染後如何在 React 中聚焦輸入欄位?
    React渲染後對輸入字段進行聚焦在React中,渲染後對輸入字段設置焦點可以通過多種方法實現. 一種方法是使用文件中建議的引用。透過將 ref 指派給渲染函數中的輸入欄位(例如「nameInput」),您可以存取其 DOM 節點並手動呼叫 focus 方法。然而,了解何時何地呼叫該函數至關重要。 ...
    程式設計 發佈於2024-11-19
  • 由於來源凍結期導致 AWS DMS 表格失敗
    由於來源凍結期導致 AWS DMS 表格失敗
    我們正在將 AWS DMS 與 db2 連接以遷移資料。在來源中,我們有大約 8 小時的凍結期,因此我們將停止並恢復 DMS 服務。 一旦我們恢復 DMS,大多數表將恢復,但某些表仍將被鎖定,因為某些更改會導致“表錯誤”狀態。此後我們無法恢復表,唯一的選項是重新載入。 我們無法定義牌桌清單或這些...
    程式設計 發佈於2024-11-19
  • 如何在 PHP Script Echo 中處理雙引號?
    如何在 PHP Script Echo 中處理雙引號?
    PHP 腳本 Echo 中的雙引號在 PHP 腳本中回顯 HTML 程式碼時,正確處理雙引號至關重要。考慮以下範例:<?php echo "<script>$('#edit_errors').html('<h3'><em>Please Correc...
    程式設計 發佈於2024-11-19
  • 如何使用正規表示式驗證電子郵件地址:語法與完整驗證?
    如何使用正規表示式驗證電子郵件地址:語法與完整驗證?
    如何使用正規表示式驗證電子郵件地址透過表單收集使用者輸入時,確保提供的電子郵件地址有效至關重要。正規表示式 (regex) 提供了執行此驗證的便捷方法。然而,僅驗證語法是不夠的。 語法驗證要執行基本語法驗證,可以使用以下正規表示式模式:[^@] @[^@] \.[^@] 此模式檢視以下內容標準:剛好...
    程式設計 發佈於2024-11-19
  • 為什麼我們要在程式退出之前呼叫 C++ 中的「delete」?
    為什麼我們要在程式退出之前呼叫 C++ 中的「delete」?
    為什麼在程式退出之前在C中呼叫delete? 在C中,在程式終止之前明確調用堆分配記憶體的delete是很重要的。如果不這樣做,可能會導致記憶體洩漏和不可靠的應用程式行為。 程式退出時的記憶體釋放雖然大多數作業系統在程式退出時自動回收堆內存,僅依賴這種預設行為可能會出現問題。造成這種情況的主要原因有...
    程式設計 發佈於2024-11-19
  • 如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    在 PHP 中組合關聯數組在 PHP 中,將兩個關聯數組組合成一個數組是常見任務。考慮以下請求:問題描述:提供的代碼定義了兩個關聯數組,$array1 和 $array2。目標是建立一個新陣列 $array3,它合併兩個陣列中的所有鍵值對。 此外,提供的陣列具有唯一的 ID,而名稱可能重疊。要求是建...
    程式設計 發佈於2024-11-19
  • ::content 偽元素如何在 Shadow DOM 中啟用深度樣式?
    ::content 偽元素如何在 Shadow DOM 中啟用深度樣式?
    揭開Shadow DOM 中的::content/:slotted 偽元素Shadow DOM 是Web 元件的一個關鍵方面,它引入了一種封裝和分離內容的新穎方法。在此領域中,::content(以前稱為 ::slotted)偽元素在啟用 ShadowTree 內的分散式節點的深層樣式方面發揮關鍵作...
    程式設計 發佈於2024-11-19

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3