当前位置: 代码迷 >> 综合 >> SWIG 打包C++常量变量供python调用( tcy)
  详细解决方案

SWIG 打包C++常量变量供python调用( tcy)

热度:53   发布时间:2024-02-24 15:20:53.0
1.example.i
%module Example %{
#include "CameraClass.h"
%}%include "tcy_variable.i" using namespace std; 
2.tcy_variable.i/*
SWIG C++ variable接口文件 Writed by tcy in Shanghai songjiang xiaokunshan.
Date:2020/10/2 2:00 used:You can put the tcy_variable.i in  %module modulename next line. 说明:常量变量名称有后缀_SWIG的未在头文件中定义,无此后缀的变量在头文件中有声明;import modulename as obj; 类似obj.x11的值都可修改不建议采用。*///1.以下常量变量定义在头文件中,若想在python使用必须添加://1.常量-直接访问
#define PI 3.14159                      // python中访问:obj.PI 可修改值
#define VERSION "1.0"         //2.只读变量:-用cvar访问const int NO1 = 1010;                   // python中访问:modulename.cvar.NO1不可修改
int const NO2 = 2020;            %constant int NO1_SWIG = 3030;          //【不建议】obj.NO1_SWIG
%constant int NO2_SWIG = 4030;          //【不建议】%constant int x11=100 ;                 //【不建议】obj.x11可修改值< /FONT> //声明普通变量只读
%immutable;                             //【不建议】obj.x12可修改值
extern int x12;                         //【建议】    obj.cvar.x12不可修改值
%mutable;%{
extern int x13;                         // obj.cvar.x13不可修改值
%}
%immutable x13;
extern int x13; %constant int x11_SWIG = 10;            //【不建议】obj.x11_SWIG< /FONT > %inline %{ 
extern int x12_SWIG;                    //【不建议】obj.cvar.x12_SWIG
int x12_SWIG=20;
%}%immutable;                              
extern int x12_SWIG;         
%mutable;%{
extern int x13_SWIG;                  //【不建议】obj.x13_SWIG
int x13_SWIG=10;
%}%immutable x13_SWIG;
extern int x13_SWIG; //2.2.全局变量
extern int g_Totals;                  //用obj.cvar.g_Totals 访问 %inline%{
extern int g_Totals_swig;          //【不建议】用obj.cvar.g_Totals_swig 访问
int g_Totals_swig=400;
%}//2.3.确保枚举定义在头文件或包装器文件
enum Color{ Color_Red, Color_Yellow, Color_Green };//【不建议】obj.Color_Red 枚举-python直接访问 
enum class People { Girl, Boy };  //obj.People_Boy %inline %{
enum Color_SWIG { RED_SWIG, GREEN_SWIG, BLUE_SWIG };//【不建议】枚举-python直接访问 %}
3.CameraClass.h#pragma once #include <iostream>
#include <string> #define PI 3.14159       
#define VERSION "1.0"  using namespace std; //常量
const int NO1 = 1010;
int const NO2 = 2020;extern int x11;
extern int x12;
extern int x13; //2.2.全局变量
extern int g_Totals;    //用cvar访问 //2.3.确保枚举定义在头文件或包装器文件
enum Color{ Color_Red, Color_Yellow, Color_Green };//普通枚举
enum class People { Girl, Boy };                                    //强枚举 
4.CameraClass.cpp#include "CameraClass.h" int x11=100;
int x12=200;
int x13=300;
int g_Totals=400;
5.python 测试:
# !/usr/bin/env python
# -*- coding: utf-8 -*- import numpy as np
import sys,os,shutil def getDesktopPath():           path=os.getcwd().split('Desktop')[0]+'Desktop'return path def copyfile(b=True):if b==False:returnpypath=getDesktopPath()+r'\Fastener\Swig'cpath=getDesktopPath()+r'\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'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 def test_variable_c(obj):# 常量测试:print(' #1.1.define PI=', obj.PI,' ; #define PI_SWIG=', obj.PI_SWIG)#常量能修改obj.PI = 1obj.PI_SWIG = 2print(' #1.2.define PI=', obj.PI, ' ; #define PI_SWIG=', obj.PI_SWIG)print(' #define VERSION=', obj.VERSION, ' ; #define VERSION_SWIG= ', obj.VERSION_SWIG)< /FONT> # 静态常量测试:print('const int NO1 = ', obj.cvar.NO1)#只读变量不能修改print('const int NO2 = ', obj.cvar.NO2)#只读变量不能修改print('INT NO1_SWIG=', obj.NO1_SWIG)print('INT NO1_SWIG=', obj.NO2_SWIG)#能修改obj.NO1_SWIG=4444< /FONT>print('x=(', obj.x11, ',', obj.cvar.x12, ',', obj.cvar.x13, ',', obj.x11_SWIG, ',', obj.cvar.x12_SWIG, ',', obj.cvar.x13_SWIG, ')')print('x=(', obj.x11, ',', obj.x12, ',', obj.x13, ',', obj.x11_SWIG, ',', obj.cvar.x12_SWIG, ',',obj.x13_SWIG, ')')obj.x11=22#obj.cvar.x12=23只读obj.x12=23print('x12=',obj.cvar.x12,obj.x12)# 全局变量print('global variable=(', obj.cvar.g_Totals, ',', obj.cvar.g_Totals_swig, ')')# 确保枚举定义在头文件或包装器文件# enum Color{ Color_Red, Color_Yellow, Color_Green };//枚举-python直接访问print('Color=',obj.Color_Green)print('People Class=',obj.People_Boy,obj.People_Girl)< /FONT># enum Color_SWIG { RED_SWIG, GREEN_SWIG, BLUE_SWIG };//枚举-python直接访问print('Color_SWIG=',obj.GREEN_SWIG)< /FONT>copyfile()
from Swig import Example  as obj test_variable_c(obj)