1. 程式人生 > >利用Swig在python中呼叫C/C++程式碼

利用Swig在python中呼叫C/C++程式碼

用途

   當我們在開發Python程式的時候,我們可以利用Python的特性來進行敏捷開發,但有時候我們可能在程式的關鍵地方需要比較高的執行效率,或者當我們與底層進行通訊時要使用C++來執行,這時我們可以有兩種方法。一是使用subprocess模組開啟編譯好的exe程式,與exe程式進行通訊,二是利用Swig工具將C++程式碼轉化為Python檔案進行呼叫,本文主要講解第二種方法。

1.建立要包裝的.h檔案和.cpp檔案

example.h標頭檔案的內容如下:

#include <iostream>
#include <string>
#include <vector>
using namespace std; class Example { public: Example(); void AddData(double data); vector<double> GetData(); private: vector<double> m_vData; };

examp.cpp檔案的內容如下:

#include "example.h"

Example::Example()
{

}

void Example::AddData(double data)
{
    m_vData.push_back(data);
}

vector
<double>
Example::GetData() { return m_vData; }

2.編寫example.i檔案

example.i檔案時一個說明檔案,Swig通過該檔案的資訊來生成_wrap.cxx檔案,關於.i檔案的寫法可以參考給出的連結或者Swig的參考文件,本例的.i檔案內容如下:

%module example

/*此處為要包含的標頭檔案*/
%{
#include "example.h"
%}

/*對STL的支援*/
%include stl.i

/*如果你想使用複合型別,例如vector<string>,請務必在.i檔案中宣告!*/
namespace std{ %template(VectorOfDouble)vector<double>; }; %include "example.h"

3.生成_wrap.cxx和py檔案

執行shell命令生成該檔案,python指令碼內容如下:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

'''
python file to excute swig shell command
'''
from os import system
system('swig -python -c++ example.i')

4. 利用distutils生成動態庫

python自帶一個distutils工具,可以用它來建立python的擴充套件模組。使用它也很簡單,只需要先定義一個配置檔案,通常是命名為setup.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

'''
setup.py file for SWIG example
'''

from distutils.core import setup,Extension

example_module = Extension('_example',sources = ['example_wrap.cxx','example.cpp'],)


setup(name = 'example',
      version = '0.1',
      author = 'WingC',
      description = 'Simple swig example',
      ext_modules = [example_module],
      py_modules = ['example'],
      )

5.生成動態連結庫.pyd檔案

編寫一個build_shell.py檔案執行shell命令生成example.pyd

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
'''
python file to generate .pyd
'''
from os import system
system('python setup.py build_ext --inplace')

6.將example.pyd和example.py移動到自己的模組中即可呼叫,例項程式碼如下:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import example

e = example.Example()
e.AddData(10)
print(e.GetData())

#程式輸出為:(10.0,)

相關推薦

c++程式呼叫c編譯器編譯後的函式,為什麼要加extern "c"?

首先,被它修飾的目標是“extern”的。也就是告訴編譯器,其宣告的函式和變數可以在本模組或其他模組中使用。通常,在模組的標頭檔案中對本模組提供給其他模組引用的函式和全域性變數以關鍵字extern宣告。 其次,被它修飾的目標是“c”,意思是其修飾的變數和函式是按照c語言方式

利用Swig在python呼叫C/C++程式碼

用途    當我們在開發Python程式的時候,我們可以利用Python的特性來進行敏捷開發,但有時候我們可能在程式的關鍵地方需要比較高的執行效率,或者當我們與底層進行通訊時要使用C++來執行,這時我們可以有兩種方法。一是使用subprocess模組開啟編譯好

System Generator從入門到放棄(九)-利用Vivado HLS block實現Vivado HLS呼叫C/C++程式碼

System Generator從入門到放棄(九)-利用Vivado HLS block實現Vivado HLS呼叫C/C++程式碼 文章目錄 System Generator從入門到放棄(九)-利用Vivado HLS block實現Vivado HLS

System Generator從入門到放棄(六)-利用Vivado HLS block實現Vivado HLS呼叫C/C++程式碼

System Generator從入門到放棄(六)-利用Vivado HLS block實現Vivado HLS呼叫C/C++程式碼 文章目錄 System Generator從入門到放棄(六)-利用Vivado HLS block實現Vivado HLS

Android開發在JAVA呼叫C/C++ native程式碼

Android 從Java呼叫C/C++ 當無法用 Java 語言編寫整個應用程式時,JNI 允許您呼叫C/C++本機程式碼。在下列典型情況下,您可能決定使用本機程式碼: 希望用更低階、更快的程式語言C/C++去實現對時間有嚴格要求的程式碼。

22.WebBrowserJS和C++程式碼互相呼叫

利用WebBrowser控制元件我們可以利用各種Web介面庫做出高大上的介面和炫酷的動畫,擴充套件性也好,甚至可以實現介面實時升級。但是有一點問題,在WebBrowser內嵌的網頁中如何訪問本地計算機硬體呢?實時上,WebBrowser內嵌的網頁中JS與本地C++程式碼可以

利用c#實現dll動態庫,並在c++呼叫的方法

           近期,在進行一個大專案開發。其中涉及多語言協同開發。主要是c#dll和c++dll的開發和應用,其中,需要在c++中呼叫c#dll的內容。現在把開發中的經驗、教訓和注意事項總結整理如下,希望對其他人能有所幫助。           1.建立c#dll,

lua同c++的互動之在c++呼叫lua程式碼

#include <iostream> #include <string.h> using namespace std; extern "C" { #include "lua.h" #include "lauxlib.h" #

C++ 程式碼呼叫scp自動傳檔案

最近在開發過程中需要把檔案傳到另一條伺服器上,且要寫在C++程式碼中,檔案比較小,幾乎能保證實時性. 在這裡直接用system呼叫linux的scp命令,且不能有互動式的功能,即彈出提示輸出密碼,所以我們需要把密碼直接傳遞過去.下面的程式碼就可實現: system("s

Python介面(2):使用ctpyes模組在python呼叫c++程式碼

如何在Python中呼叫C/C++程式碼 How to mix C/C++ code in Python 本文介紹一種手動的、簡單的在Python中使用C/C++程式碼的方式。這個方法主要使用了ctypes模組。其他的混合Python,C/C++程式設計的方法還有Swi

如何讓C#程式碼呼叫的物件的方法有提示說明

需要引用的dll檔案的,類中需要有提示資訊,如下: 在vs中 專案--屬性--生成--輸出--xml文件生成,如下圖所示: 最後,確定你在引用的程式集dll檔案和xml檔案的路徑是一致的,就

如何在ubuntu寫一個簡單的C語言程式碼並編譯執行

首先需要安裝一個編譯器 因為筆者也是剛剛開始學習ubuntu所以不知道各個編譯器之間的區別,筆者所用的是gcc就簡單介紹一下gcc的安裝方法吧。 方法一: 開啟控制檯輸入以下程式碼: sudo apt-get build-dep gcc; sudo apt-get bui

在Android studio 3.2 版專案使用cmake呼叫C/C++

本文操作環境: win10/Android studio 3.2 1.環境配置     在SDK Tools裡選擇 CMAKE/LLDB/NDK點選OK 安裝這些外掛.   2.建立CMakeLists.txt檔案   在Proj

使用ctype在python呼叫c

之前在python中呼叫c++是通過命令列呼叫的,引數傳遞是使用檔案IO的形式,所以會特別慢 現在用ctypes,引數傳遞傳的只是記憶體中的指標,這就很舒服 現在來總結下如何使用cytpes在python中呼叫c (Ubuntu系統下)   首先寫一個test.c的原始碼 int a

C#封裝的dll檔案在Labview呼叫

  操作步驟 1.開啟vi的後面板,右鍵單擊選擇“Connectivity”------“.NET”--------"ConstructorNode"此時會彈出窗。選擇所需dll檔案             &nb

(四)NDK開發之 java 與C/C++ 程式碼互相呼叫

java 呼叫c/c++ 的方法,很簡單。我們勾選建立支援C/C++ 專案的時候,就已經生成了一個Demo 下面主要介紹,C/C++ 呼叫 java 的方法。   一、訪問 java 成員非靜態成員變數: JNI 呼叫java非靜態變數的 方法名格式 : Ge

MATLAB呼叫.C程式

需要把 .c  變成 MATLAB 可以識別的程式碼 在MATLAB中進入 .c 檔案所在的當前目錄,然後  mex  BP_General_C.c 。該路徑下生成BP_General_C.mexa64檔案,即為MATLAB可以呼叫的檔案。 mex 

JNI 最簡單的Java呼叫C/C 程式碼

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

python呼叫 C#動態連結庫問題記錄

程式[摘自https://blog.csdn.net/LTG01/article/details/80700513]  import clr clr.FindAssembly("PythonNetTest.dll") ## 載入c#dll檔案 from PythonNetTest import *

C++傳參構造的優化和討論構造拷貝構造N呼叫情況

C++對傳參和傳返回值時建構函式的優化處理 1.c++形式引數型別和返回值為引用時,會把實參或者返回值引用自動賦給形式引數(返回值)。 2.c++返回值賦值和返回值使用一般會進行編譯器的優化。 3.c++函式引數(或者返回值)賦值時,如果其型別是類並且對應