C#使用CLE调用Python

  • 项目相关
  • 入门
    • 运行官方Demo
      • 初始化服务与退出服务
      • C#代码
      • Python代码
    • 遇到的问题
  • 其他
    • CLE Object
    • 设置输出回调

项目相关

工作需要使用C#调用python的AI识别,python版本为3.7,IronPython只支持python2.7,所以不考虑,考虑在内的方案还有 PythonNetCLE
由于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相关推荐

  1. Android Studio调用python运行thensorflow模型--CLE方案实现

    我使用的是虚拟android设备,故对应的CLE中库文件版本为/x86,你可以根据自己开发环境找到对应的版本.调用的python版本为3.7,以下为主要步骤: 1.环境准备 在官网下载最新的CLE f ...

  2. android studio调用python_Android Studio调用python运行thensorflow模型--CLE方案实现

    Android Studio调用python运行thensorflow模型--CLE方案实现 Android Studio调用python运行thensorflow模型--CLE方案实现 我使用的是虚 ...

  3. 安卓下调用python(并调用C库暂时失败)暂时使用JNI方式

    参考网上的安卓下调用python是有三种方法的,但是尝试也只有JNI方式才可能可行. 1.Chaquopy方案(不支持我们需要所使用的cyptes等库并且需要付费的) 2.CLE方案,该官网已经进不去 ...

  4. android调用python脚本

    前言 文章可以帮你解决android下调用python方法获取返回值,往python函数中传参等.开发环境基于Android studio. 详细介绍 一.环境准备 在官网下载最新的CLE for A ...

  5. android 调用 python

    文章可以帮你解决android下调用python方法获取返回值,往python函数中传参等... 我这里使用AS,如果使用ec开发的直接看 http://www.srplab.com/cn/index ...

  6. java中调用python

    在Java中调用Python </h1><div class="clear"></div><div class="postBod ...

  7. C++调用Python文件,TensorFlow和PyTorch构建的深度学习模型,无法使用GPU的情况分析。

    C++调用Python深度学习模型,包含TensorFlow和PyTorch等构造的模型,然后使用GPU出现问题.包含C++调用Python函数,C++加载模型到GPU,GPU内存占用过大,计算完毕内 ...

  8. 【Qt】Qt中调用python接口

    在Qt程序中调用python函数从步骤 1.在pro中添加python的头文件路径和库 INCLUDEPATH += /usr/include/python3.4 LIBS += -L /usr/li ...

  9. java可以调用python程序吗_我们可以从java调用python方法吗?

    是的,那可以做到.通常,这将通过创建PythonInterpreter对象然后使用它来调用python类来完成. 请考虑以下示例: Java: import org.python.core.PyIns ...

最新文章

  1. c语言饭卡管理系统链表文件,C语言《学生信息管理系统》链表+文件操作
  2. 物联网改变生活——飞思卡尔技术论坛中国站侧记
  3. PelleeNet_SSD
  4. 将一个字符串计算出CRC16/XMODEM校验码(4位)
  5. 斗地主案例的代码实现
  6. POJ - 1273 Drainage Ditches(最大流)
  7. Python学习:命令行运行,循环结构
  8. 计算机管理 如何将c盘,教程:新买的电脑如何把C盘分区成多个盘?
  9. 地大计算机学院保研华科人数,2020年华中科技大学保研率是多少
  10. Python基础函数学习笔记(一)
  11. Oracle安装本地和远程两种方式的DISPLAY设置
  12. 张学孟 (帮别人名字作诗)
  13. codeforces228A Is your horseshoe on the other hoof?(水题)
  14. CA配置证书自动注册
  15. 微信禁止模拟器登录怎么办?
  16. latex公式文字划掉的效果
  17. web安全基础之HTTP
  18. 网页设计经典案例(Web)
  19. 有点厉害!用12万行代码堆出来个蔡徐坤,关键是能跑能跳!
  20. 求y=sinx反函数的导数

热门文章

  1. C 实现Mysql增量备份_mysql增量备份 - lyle_luo的个人页面 - OSCHINA - 中文开源技术交流社区...
  2. Docker commit 联系
  3. CTE表--SQLSERVER2005看得见的性能提升
  4. 一文看懂企业数据资产目录
  5. (转)一位资深程序员大牛给予Java初学者的学习路线建议
  6. 重装Win10系统后导致网速卡的解决办法
  7. 乐视超级电视刷鸿蒙,乐视超3X55刷精简+root系统记录
  8. 小巧简便且美观的桌面便签记事备忘工具
  9. 44学习自动化运维工具 Chef 的基本用法,包括厨师编写、节点管理
  10. 众海世纪影业:五一档19部影片“扎堆”,能否再次掀起观影热潮?