SWIG 打包C++陣列供python呼叫 tcy
1.1.carrays.i
用途:
該模組定義將普通C指標包裝為陣列的巨集;不提供任何安全性;
僅提供用於建立,銷燬和修改原始C陣列資料內容的功能
1.2.%array_functions(type, name)
用途:建立四個函式,供你建立銷燬輔值及讀陣列元素
函式:
type *new_name(int nelements) //建立新動態陣列分配記憶體
type *delete_name(type *ary) //銷燬陣列
type name_getitem(type *ary, int index) //讀陣列元素
void name_setitem(type *ary, int index, type value) //設定設定元素
說明:type可是任何型別;name不應該與介面檔案中有重名
示例:
void print_array(double x[6]) {
int i;
for (i = 0; i < 6; i++) { printf("[%d] = %g\n", i, x[i]); }
}
包裝:
%module example
%include "carrays.i"
%array_functions(double, doubleArray);
void print_array(double x[10]);
python測試:
a = new_doubleArray(10) # Create an array
for i in range(0, 10):
doubleArray_setitem(a, i, 2 * i) # Set a value
print_array(a) # Pass to C
delete_doubleArray(a) # Destroy array
1.3.%array_class(type, name)
用途:將指標包裝為類;在基於類介面內包裝*型別指標;常與代理類結合使用
注意:型別限制為簡單型別如int或float
結構:
struct name {
name(int nelements); // Create an array
~name(); // Delete array
type getitem(int index); // Return item
void setitem(int index, type value); // Set item
type *cast(); // Cast to original type
static name *frompointer(type *); // Create class wrapper from existing pointer
};
例項:
%module example
%include "carrays.i"
%array_class(double, doubleArray);
void print_array(double x[10]);
python操作:
import example
c = example.doubleArray(10) # Create double[10]
for i in range(0, 10):
c[i] = 2 * i # Assign values
example.print_array(c) # Pass to C
1.4.注意:
%array_functions,%array_class巨集不會將C陣列封裝在特殊資料結構或代理中
沒有邊界檢查或任何形式安全性。如需要應該考慮使用特殊陣列物件而不是裸指標
%array_functions,%array_class不應與char或char *型別一起使用
SWIG對這些型別預設作為字串處理
2.例項:
例項1:陣列-自定義輔助函式
#pragma once
//1.1.example.h
void add(float *rst_arr, const float *arr, int rst_size, int size);
//1.2.Example.cpp
#include "Example.h"
void add(float *rst_arr, const float *arr, int rst_size, int size)
{
float n = 0;
for (int i = 0;i < rst_size; i++)
{
if (i < size)
rst_arr[i] = arr[i] + 100;
else
rst_arr[i] = n + 100;
n += 1;
}
}
//1.3.1.SWIG介面檔案Example.i
//自定義陣列輔助函式
%module Example//定義模組名
%{
#include "Example.h"
%}
#include "Example.h"
using namespace std;
%inline%{
static float *new_floatArray(size_t nelements) {
return (new float[nelements]());
}
static void delete_floatArray(float *ary){
delete[] ary;
}
static float floatArray_getitem(float *ary, size_t index) {
return ary[index];
}
static void floatArray_setitem(float *ary, size_t index, float value) {
ary[index] = value;
}
%}
void add(float *rst_arr,const float *arr, int rst_size, int size);
//1.3.2.SWIG介面檔案Example.i
//用carray.i
%module Example//定義模組名
%include "carrays.i"
%array_functions(float, floatArray);
%{
#include "Example.h"
%}
#include "Example.h"
using namespace std;
%}
void add(float *rst_arr,const float *arr, int rst_size, int size);
//1.3.3.SWIG介面檔案Example.i
//自定義陣列輔助類(推薦)自動釋放指標
%module Example//定義模組名
%{
#include "Example.h"
%}
#include "Example.h"
using namespace std;
%inline%{
class FloatArrClass
{
private:
size_t size;
float *p_float;
public:
size_t getSize(){return size;}
float *getFloatPointer(){return p_float;}
float *new_floatArray(size_t nelements) {
return (new float[nelements]());
}
void delete_floatArray(float *ary) {
delete[] ary;
}
float floatArray_getitem(float *ary, size_t index) {
return ary[index];
}
void floatArray_setitem(float *ary, size_t index, float value) {
ary[index] = value;
}
void floatArray_setitem(float *ary, size_t index, float value) {
ary[index] = value;
}//swig不支援設定arr[]下標過載
FloatArrClass() { size = 0; }
FloatArrClass(size_t n) { size = n; p_float = new_floatArray(n); }
FloatArrClass(const FloatArrClass &o) { size = o.size; p_float = o.p_float; }
~FloatArrClass() {
if (p_float != NULL) { delete_floatArray(p_float); p_float = NULL; }
}
};
%}
void add(float *rst_arr,const float *arr, int rst_size, int size);
//1.4.python測試程式:
# !/usr/bin/env python
# -*- coding: utf-8 -*-
# from Swig.Camera import add,HalconClass
import numpy as np
import sys,os,shutil
def copyfile(b=True):
if b==False:return
pypath=r'C:\Users\Administrator\Desktop\Fastener\Swig'
cpath=r'C:\Users\Administrator\Desktop\ProjectSwigWin\x64\Release'
filename=r'Example'
cfile_py=cpath+'\\'+filename+'.py'
cfile_pyd=cpath+r'\ProjectSwigWin.pyd'
pyfile_py=pypath+'\\'+filename+'.py'
pyfile_pyd=pypath+r'\_'+filename+'.pyd'
print(cfile_py)
if os.path.isfile(cfile_py):
shutil.copyfile(cfile_py,pyfile_py)
else:
print('not camera.py',cfile_py)
return
if os.path.isfile(cfile_pyd):
shutil.copyfile(cfile_pyd,pyfile_pyd)
else:
print('not camera.pyd')
return
copyfile()
from Swig import Example as obj
#陣列測試:
def test_Add_C_PulsPulse(obj,obj1,obj2,rst_arr,arr,n=6):
obj1=obj1 if obj1 else obj
obj2 = obj2 if obj2 else obj
for i in range(n): #初始化陣列
obj1.floatArray_setitem(rst_arr, i, 0)
obj2.floatArray_setitem(arr, i, i)
obj.add(rst_arr,arr, n, n)#rst_arr=arr+100
print('test arr:')
for i in range(6): #顯示陣列元素
print("[%6.2f %6.2f]" % (obj.floatArray_getitem(rst_arr, i), obj.floatArray_getitem(arr, i)))
# 自定義函式或用carray.i
n=6
rst_arr = obj.new_floatArray(n)
arr = obj.new_floatArray(n)
test_Add_C_PulsPulse(obj,None,None,rst_arr,arr,n)
#
obj.delete_floatArray(rst_arr)
obj.delete_floatArray(arr)
#類運算元組:
a1=obj.FloatArrClass(6)
a2=obj.FloatArrClass(6)
size1=a1.getSize()
size2=a2.getSize()
rst_arr=a1.getFloatPointer()
arr=a2.getFloatPointer()
test_Add_C_PulsPulse(obj,a1,a2,rst_arr,arr,n)
============================================================================
https://blog.csdn.net/qianshuyuankk/article/details/103051774
相關文章
- Windows上Python使用swig呼叫C++WindowsPythonC++
- C++ list (tcy)C++
- C++陣列 字串C++陣列字串
- C++陣列長度C++陣列
- c++陣列排序插入C++陣列排序
- c++中的陣列C++陣列
- Python呼叫C/C++方式PythonC++
- C/C++ 二維陣列的理解(多維陣列)C++陣列
- C++ ——vector陣列筆記C++陣列筆記
- 陣列與方法的呼叫(重點)陣列
- C/C++ 讀入一個整型陣列,陣列大小未知C++陣列
- C++ 獲取陣列大小、多維陣列操作詳解C++陣列
- 在QT C++中呼叫 Python並將軟體打包釋出(裸機可執行)QTC++Python
- C++陣列的連續性C++陣列
- C++ 陣列的 auto 和 decltypeC++陣列
- c++筆記_多維陣列C++筆記陣列
- Python陣列常用操作Python陣列
- Python呼叫C++編寫的方法PythonC++
- Python與C/C++呼叫之ctypesPythonC++
- linux下qt用c++呼叫pythonLinuxQTC++Python
- python和c++的相互呼叫教程PythonC++
- C++獲取陣列的長度C++陣列
- C++陣列預設初值問題C++陣列
- C++ 陣列宣告和初始化C++陣列
- C++ 煉氣期之陣列探幽C++陣列
- C++ 使用 new 建立二維陣列C++陣列
- python輸入詳解(陣列、矩陣)Python陣列矩陣
- Python列表建立NumPy陣列Python陣列
- Python多個陣列合並(拼接)為一個陣列Python陣列
- c++ -- 二維陣列引數傳遞C++陣列
- C++ Break、Continue 和 陣列操作詳解C++陣列
- c++遍歷陣列的多種方式C++陣列
- Python多個陣列合並Python陣列
- Python陣列中求和問題Python陣列
- python中怎麼列印陣列Python陣列
- python怎麼定義陣列Python陣列
- python多維陣列切片方法Python陣列
- 技術積累——C++ 呼叫 python 專案C++Python