C#使用CLE调用python
C#使用CLE调用Python
- 项目相关
- 入门
- 运行官方Demo
- 初始化服务与退出服务
- C#代码
- Python代码
- 遇到的问题
- 其他
- CLE Object
- 设置输出回调
项目相关
工作需要使用C#调用python的AI识别,python版本为3.7,IronPython只支持python2.7,所以不考虑,考虑在内的方案还有 PythonNet与 CLE
由于PythonNet总是报Python的dll文件签名不一致,无法调用,找不到解决办法,所以选择了CLE。
入门
CLE版本为 CLE for Windows 3.0.0 64 bit版本。
Python版本为 Anaconda Python 3.7.1 64 bit
CLE安装完成后 其文件目录在
C:\srplab
CLE的详细文档在
C:\Program Files\srplab\starcore\docs
运行官方Demo
官方给出了一个C#调用Python的Demo
安装CLE后Demo所在的路径:C:\srplab\examples\rawobject\cs_callscripts\call_python
在Visual Studio 2017中打开此项目,在项目属性中,将目标框架选择为 .NET Framework 4.5.2,
并为项目添加引用
C:\srplab\libs64\star_csharp452.dll
后缀的数字为对应的 .NET Framework 版本
初始化服务与退出服务
官方给出了3种C#初始化的方式===>CLE初始化的方式
Demo里使用的是第二种
static void Main(string[] args){ StarCoreFactory starcore=StarCoreFactory.GetFactory(); StarServiceClass Service=starcore._InitSimple("test","123",0,0,null); StarSrvGroupClass SrvGroup = (StarSrvGroupClass)Service._Get("_ServiceGroup"); ...... SrvGroup._ClearService(); starcore._ModuleExit(); }
C#代码
这里是官方Demo的代码
static void Main(string[] args){StarCoreFactory starcore = StarCoreFactory.GetFactory();StarServiceClass Service = starcore._InitSimple("test", "123", 0, 0);StarSrvGroupClass SrvGroup = (StarSrvGroupClass)Service._Get("_ServiceGroup");//--初始化python服务组 (python会默认启动2.7 所以使用python37) 返回true 为成功Console.WriteLine(SrvGroup._InitRaw("python37", Service));//--加载python模块 返回true 为成功//-- 这里的路径为C:\srplab\examples\rawobject\python.package\testpy.pyConsole.WriteLine(SrvGroup._LoadRawModule("python", "", "..\\..\\..\\..\\python.package\\testpy.py", false));//--获取python的全局对象StarObjectClass obj = Service._ImportRawContext("python", "", false, null);//--调用该对象中的tt函数 获取return的对象StarObjectClass retobj = (StarObjectClass)obj._Call("tt", "hello ", "world");//根据index打印返回值Console.WriteLine("ret from python : " + retobj._Get(0) + " " + retobj._Get(1));//ret from python : 666 777//--根据name获取obj中的对象Console.WriteLine("python value g1 : " + obj._Get("g1"));//python value g1 : 123//--调用yy函数,yy的返回值是一个dict,转成StarObjectClass可以调用他自带的方法StarObjectClass yy = (StarObjectClass)obj._Call("yy", "hello ", "world", 123);//--yy是一个python dict对象 调用他的__len__ 打印长度//-- yy._Get("key") 可以获取到对应的valueConsole.WriteLine("python value dict length : " + yy._Call("__len__"));//python value dict length : 2//--获取一个全局的Class类对象StarObjectClass Multiply = Service._ImportRawContext("python", "Multiply", true, null);//创建该类对象的实例,这里_StarCall应该是new Class约定的函数名称,没有找到更多想信息StarObjectClass multiply = Multiply._Callobject("_StarCall", 33, 44);//--调用该实例的multiply方法并传参Console.WriteLine("instance multiply = " + multiply._Call("multiply", 11, 22));//instance multiply = 242//关闭服务SrvGroup._ClearService();starcore._ModuleExit();Console.ReadKey();}
Python代码
这里也是官方Demo的代码
def tt(a,b) :print(a,b)return 666,777
g1 = 123
def yy(a,b,z) :print(a,b,z)return {'jack': 4098, 'sape': 4139}class Multiply :def __init__(self,x,y) :self.a = xself.b = ydef multiply(self,a,b):print("multiply....",self,a,b)return a * b
遇到的问题
Fatal Python error: initfsencoding: unable to load the file system codec
ModuleNotFoundError: No module named ‘encoding’
因为我使用的Python为Anaconda3,在安装时选择了添加到环境变量的选项,但是并没有添加PYTHONHOME这一环境变量,导致程序找不到Python编码器,添加PYTHONHOME环境变量解决了这一问题。
使用CLE的SRP Watch可以查看服务运行时产生的问题,包括调用脚本的输出,都在SRP Watch中。
其他
CLE Object
CLE是一个运行的服务,在我理解,多种语言的相互调用,是因为他们被转换成了CLE Object(StarObjectClass)储存在CLE的服务中,供我们调用。
任何对象(包括script文件)都可以被转换成CLE Object来进行不同语言的调用。
StarObjectClass常用的函数有
函数名 | 参数 | 返回值 | 作用 |
---|---|---|---|
_Call | string FuncName,params object[] Args | object | 根据函数名称调用函数 |
_Callobject | string FuncName,params object[] Args | object | 和_Call差不多,但是文档没有具体说明,_CallObejct("_StarCall", params)是实例化类对象 |
_Get | object Name | object | 根据Name获取变量(不能用来获取函数) |
_Set | object Name, object value | void | 根据Name设置变量的值 |
_RegScriptProc_P | string scriptName ,delegate StarObjectScriptProcInterface(object self, object[] Params) | void | 为CLE Object添加一个函数 self为该CLE Object本身,Params为函数的参数 |
_GetRawContextType | string | 获取原始脚本对象的类型名称 |
Python类型与C# CLE中的类型比对
Python类型 | C#类型 |
---|---|
int | Int32 |
float | Double |
bool | Bool |
string | String |
其他 | StarObjectClass |
设置输出回调
当调用的Python文件有 print 时,会打印在服务端(SPR Watch 中可以看到 )
通过设置 StarCoreFactory ._RegMsgCallBack_P 可以设置在有输出时的回调事件
//设置服务端输出的回调函数
StarCoreFactory starcore = StarCoreFactory.GetFactory();
starcore._RegMsgCallBack_P(delegate(int ServiceID, int uMes, object wParam, object IParam)
{//判断是否为输出if (uMes == starcore._Getint("MSG_DISPMSG") || uMes == starcore._Getint("MSG_DISPLUAMSG")){//wParam为输出信息string msg = (string)wParam;//to do 这里直接打印到控制台上Console.WriteLine(msg);}return null;
});
C#使用CLE调用python相关推荐
- Android Studio调用python运行thensorflow模型--CLE方案实现
我使用的是虚拟android设备,故对应的CLE中库文件版本为/x86,你可以根据自己开发环境找到对应的版本.调用的python版本为3.7,以下为主要步骤: 1.环境准备 在官网下载最新的CLE f ...
- android studio调用python_Android Studio调用python运行thensorflow模型--CLE方案实现
Android Studio调用python运行thensorflow模型--CLE方案实现 Android Studio调用python运行thensorflow模型--CLE方案实现 我使用的是虚 ...
- 安卓下调用python(并调用C库暂时失败)暂时使用JNI方式
参考网上的安卓下调用python是有三种方法的,但是尝试也只有JNI方式才可能可行. 1.Chaquopy方案(不支持我们需要所使用的cyptes等库并且需要付费的) 2.CLE方案,该官网已经进不去 ...
- android调用python脚本
前言 文章可以帮你解决android下调用python方法获取返回值,往python函数中传参等.开发环境基于Android studio. 详细介绍 一.环境准备 在官网下载最新的CLE for A ...
- android 调用 python
文章可以帮你解决android下调用python方法获取返回值,往python函数中传参等... 我这里使用AS,如果使用ec开发的直接看 http://www.srplab.com/cn/index ...
- java中调用python
在Java中调用Python </h1><div class="clear"></div><div class="postBod ...
- C++调用Python文件,TensorFlow和PyTorch构建的深度学习模型,无法使用GPU的情况分析。
C++调用Python深度学习模型,包含TensorFlow和PyTorch等构造的模型,然后使用GPU出现问题.包含C++调用Python函数,C++加载模型到GPU,GPU内存占用过大,计算完毕内 ...
- 【Qt】Qt中调用python接口
在Qt程序中调用python函数从步骤 1.在pro中添加python的头文件路径和库 INCLUDEPATH += /usr/include/python3.4 LIBS += -L /usr/li ...
- java可以调用python程序吗_我们可以从java调用python方法吗?
是的,那可以做到.通常,这将通过创建PythonInterpreter对象然后使用它来调用python类来完成. 请考虑以下示例: Java: import org.python.core.PyIns ...
最新文章
- c语言饭卡管理系统链表文件,C语言《学生信息管理系统》链表+文件操作
- 物联网改变生活——飞思卡尔技术论坛中国站侧记
- PelleeNet_SSD
- 将一个字符串计算出CRC16/XMODEM校验码(4位)
- 斗地主案例的代码实现
- POJ - 1273 Drainage Ditches(最大流)
- Python学习:命令行运行,循环结构
- 计算机管理 如何将c盘,教程:新买的电脑如何把C盘分区成多个盘?
- 地大计算机学院保研华科人数,2020年华中科技大学保研率是多少
- Python基础函数学习笔记(一)
- Oracle安装本地和远程两种方式的DISPLAY设置
- 张学孟 (帮别人名字作诗)
- codeforces228A Is your horseshoe on the other hoof?(水题)
- CA配置证书自动注册
- 微信禁止模拟器登录怎么办?
- latex公式文字划掉的效果
- web安全基础之HTTP
- 网页设计经典案例(Web)
- 有点厉害!用12万行代码堆出来个蔡徐坤,关键是能跑能跳!
- 求y=sinx反函数的导数
热门文章
- C 实现Mysql增量备份_mysql增量备份 - lyle_luo的个人页面 - OSCHINA - 中文开源技术交流社区...
- Docker commit 联系
- CTE表--SQLSERVER2005看得见的性能提升
- 一文看懂企业数据资产目录
- (转)一位资深程序员大牛给予Java初学者的学习路线建议
- 重装Win10系统后导致网速卡的解决办法
- 乐视超级电视刷鸿蒙,乐视超3X55刷精简+root系统记录
- 小巧简便且美观的桌面便签记事备忘工具
- 44学习自动化运维工具 Chef 的基本用法,包括厨师编写、节点管理
- 众海世纪影业:五一档19部影片“扎堆”,能否再次掀起观影热潮?