一个在C#中集成Python的例子

一个在C#中集成Python的例子。在C#中可以执行Python脚本,在Python中也可以调用C#宿主中的功能(clr.AddReference('Business'))。 

文件说明

Debug为执行目录

Mgr.exe为执行文件

Py\init.py为python初始化脚本

Py\Lib.zip为python需要的模块,可以在init.py中import

Data为数据库目录

mgr.db为mgr.exe使用的数据库

操作说明

系统设置

可以在这里修改运行的参数

打开一个账户

用户的规则设置

交易

代码说明

Python的说明

在Python中可以调用C#宿主中的功能(clr.AddReference('Business'))。 

import clr
import io
import os
import stringclr.AddReference('System')
clr.AddReference('System.Data')
clr.AddReference('Business')from System import *
from System.Data import *
from Business import *def get_account_money_by_dt(account_id,date):db=Pub.db_name_mgrInitMoney=Pub.select_str(db,"select InitMoney from account where account_id="+account_id)cash=Pub.select_str(db,"select sum(amount_real) from tran where account_id="+account_id+" and tran_date<="+date)stock_amount=float.Parse("0")table_stock=Pub.select(db,"select code_type,code,sum(tran_count_real) as c from tran where account_id="+account_id+" and code<>'' and tran_date<="+date +" group by code_type,code")for dr in table_stock.Rows:code_type=DBUtils.get_str(dr, "code_type");code=DBUtils.get_str(dr, "code");count=DBUtils.get_str(dr, "c");price=Pub.select_str(code_type+"\\"+code,"select close from data_day where dt<="+date+" order by dt desc limit 1")if price<>'':stock_amount=stock_amount+float.Parse(price)*float.Parse(count)if cash=="":cash="0"if InitMoney=="":InitMoney="0"return (float.Parse(InitMoney)+float.Parse(cash)+stock_amount).ToString("0.00")

C#的说明

加载Python环境

            instance = new Py();
            instance.init_py_lib();

        public void init_py_lib(){engine = IronPython.Hosting.Python.CreateEngine();scope = engine.CreateScope();engine.Runtime.IO.SetOutput(Output,Encoding.Unicode);engine.SetTrace(on_trace);StringBuilder sb = new StringBuilder();sb.AppendLine(@"import sys ");sb.AppendLine(@"sys.path.append("".\py\Lib.zip"") ");sb.AppendLine(@"sys.path.append("".\scripts"") ");ScriptSource source = engine.CreateScriptSourceFromString(sb.ToString());source.Execute(scope);string init_py = Pub.exe_dir + @"\py\init.py";if (System.IO.File.Exists(init_py)){ScriptSource source_init = engine.CreateScriptSourceFromFile(init_py);source_init.Execute(scope);}}

执行脚本

 

       public Boolean Execute(string script, out string msg, out IronPyErrors err, ExecRequest request){msg = "";err = new IronPyErrors();StringBuilder sb = request.log;sb.AppendLine("开始 "+DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") );sb.AppendLine("------");try{last_trace_lineno = "";last_trace_result = "";ScriptSource source = engine.CreateScriptSourceFromString(script);                CompiledCode cc = source.Compile(err);  if (err.Items.Count > 0){err.ToStringBuilder(sb);msg = "编译错误";sb.Append(msg);return false;}scope.SetVariable("request", request);Py.instance.Output.SetLength(0);string sql_err = DataAccess.DataConn.clear_err();cc.Execute(scope);               Py.instance.Output.Flush();string print_s = Encoding.Unicode.GetString(Py.instance.Output.ToArray());sql_err = DataAccess.DataConn.clear_err();if (sql_err != "")sb.AppendLine(sql_err);sb.AppendLine(print_s);sb.AppendLine("------");msg = "运行完成 "+ DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") ;sb.Append(msg);return true;}catch (Exception e){if (last_trace_lineno != "")msg = "trace line:" + last_trace_lineno;if (last_trace_result != "")msg = msg + " " + "trace:" + last_trace_result;msg = msg + " " + e.Message;sb.Append(msg);}return false;}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using Microsoft.Scripting;
using Microsoft.Scripting.Hosting;
using IronPython;
using IronPython.Runtime;
using IronPython.Modules;
using IronPython.Compiler;
using IronPython.Runtime.Exceptions;
using IronPython.Hosting;
using Business;namespace Mgr
{public class Py{public static Py instance = null;public static void init(){if (instance != null)return;instance = new Py();instance.init_py_lib();}public ScriptEngine engine = null;public ScriptScope scope = null;public static string get_key(string name){return name.Trim().ToLower();}public static Dictionary<string , ScriptSource> ScriptDict = new Dictionary<string , ScriptSource>();public string set_script(string id ,string script){if (id == "")id = Guid.NewGuid().ToString();id = get_key(id);ScriptSource source = engine.CreateScriptSourceFromString(script);ScriptDict[id] = source;return id;}public string last_trace_lineno = "";public string last_trace_result = "";public TracebackDelegate on_trace(TraceBackFrame frame, string result, object payload){last_trace_lineno = frame.f_lineno.ToString();last_trace_result = result;return on_trace;}public Boolean Compile(string script,out string msg, out CompiledCode cc, out  IronPyErrors err){msg = "";err = new IronPyErrors();cc = null;try{ScriptSource source = engine.CreateScriptSourceFromString(script);              cc = source.Compile(err);msg = "编译完成";return true;}catch (Exception e){msg = e.Message;}return false;}public Boolean Execute_cc(CompiledCode cc, out string msg, ExecRequest request){msg = "";StringBuilder sb = request.log;sb.AppendLine("开始 " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));sb.AppendLine("------");try{last_trace_lineno = "";last_trace_result = "";scope.SetVariable("request", request);Py.instance.Output.SetLength(0);string sql_err = DataAccess.DataConn.clear_err();cc.Execute(scope);Py.instance.Output.Flush();string print_s = Encoding.Unicode.GetString(Py.instance.Output.ToArray());sql_err = DataAccess.DataConn.clear_err();if (sql_err != "")sb.AppendLine(sql_err);sb.AppendLine(print_s);sb.AppendLine("------");msg = "运行完成 " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");sb.Append(msg);return true;}catch (Exception e){if (last_trace_lineno != "")msg = "trace line:" + last_trace_lineno;if (last_trace_result != "")msg = msg + " " + "trace:" + last_trace_result;msg = msg + " " + e.Message;sb.Append(msg);}return false;}public Boolean Execute(string script, out string msg, out IronPyErrors err, ExecRequest request){msg = "";err = new IronPyErrors();StringBuilder sb = request.log;sb.AppendLine("开始 "+DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") );sb.AppendLine("------");try{last_trace_lineno = "";last_trace_result = "";ScriptSource source = engine.CreateScriptSourceFromString(script);                CompiledCode cc = source.Compile(err);  if (err.Items.Count > 0){err.ToStringBuilder(sb);msg = "编译错误";sb.Append(msg);return false;}scope.SetVariable("request", request);Py.instance.Output.SetLength(0);string sql_err = DataAccess.DataConn.clear_err();cc.Execute(scope);               Py.instance.Output.Flush();string print_s = Encoding.Unicode.GetString(Py.instance.Output.ToArray());sql_err = DataAccess.DataConn.clear_err();if (sql_err != "")sb.AppendLine(sql_err);sb.AppendLine(print_s);sb.AppendLine("------");msg = "运行完成 "+ DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") ;sb.Append(msg);return true;}catch (Exception e){if (last_trace_lineno != "")msg = "trace line:" + last_trace_lineno;if (last_trace_result != "")msg = msg + " " + "trace:" + last_trace_result;msg = msg + " " + e.Message;sb.Append(msg);}return false;}public MemoryStream Output = new MemoryStream();public void init_py_lib(){engine = IronPython.Hosting.Python.CreateEngine();scope = engine.CreateScope();engine.Runtime.IO.SetOutput(Output,Encoding.Unicode);engine.SetTrace(on_trace);StringBuilder sb = new StringBuilder();sb.AppendLine(@"import sys ");sb.AppendLine(@"sys.path.append("".\py\Lib.zip"") ");sb.AppendLine(@"sys.path.append("".\scripts"") ");ScriptSource source = engine.CreateScriptSourceFromString(sb.ToString());source.Execute(scope);string init_py = Pub.exe_dir + @"\py\init.py";if (System.IO.File.Exists(init_py)){ScriptSource source_init = engine.CreateScriptSourceFromFile(init_py);source_init.Execute(scope);}}}public class IronPyErrorsItem{public string Message { get; set; }public int ErrorCode { get; set; }public Severity sev { get; set; }public SourceSpan Span { get; set; }public string get_info(){string line = "";line = Span.Start.Line.ToString() + "行" + Span.Start.Column.ToString() + "列";line = line + "(" + sev.ToString() +" " + ErrorCode.ToString()+"): ";line = line +  Message;return line;}}public class IronPyErrors : ErrorListener{public List<IronPyErrorsItem> Items = new List<IronPyErrorsItem>();public void ToStringBuilder(StringBuilder sb){foreach (IronPyErrorsItem i in Items){sb.AppendLine(i.get_info());}}public override void ErrorReported(ScriptSource source, string message, Microsoft.Scripting.SourceSpan span, int errorCode, Microsoft.Scripting.Severity severity){IronPyErrorsItem i = new IronPyErrorsItem{Message = message,ErrorCode = errorCode,sev = severity,Span = span};Items.Add(i);}
}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/27978.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux丢包故障的定位与解决(自驾_ROS)

参考【https://www.cnblogs.com/zhangmingda/p/11671970.html】 链路层问题排查 netstat -i 查看关注的接口RX/TX-DRP和/RX/TX-OVR是否存在丢包 cat /proc/net/dev查看Receive与Transmit的fifo列&#xff0c;如果不为0说明存在ring buffer到达/生成速率高于内核处理速率&…

企业化运维(2)_nginx

###1.nginx源码安装部署### ###2.平滑升级### &#xff08;1&#xff09;版本升级 当服务器在运行时&#xff0c;需要升级的情况下&#xff0c;平滑升级即就是不断开服务器就可以进行升级&#xff0c;最大限度保证数据的完整性。 下载nginx新版本软件&#xff0c;正常执行./c…

PHP入门教程1:PHP的基础概念和基本语法

本文将从基础开始&#xff0c;介绍PHP的基础概念和基本语法。 PHP简介环境搭建基本语法变量和常量数据类型操作符常见错误和调试方法 1. PHP简介 PHP&#xff0c;全称是 “PHP: Hypertext Preprocessor”&#xff0c;是一种开源的通用脚本语言&#xff0c;尤其适用于Web开发…

蔡崇信“预言”:微软与OpenAI未来极有可能会分道扬镳

近日&#xff0c;在美国投行摩根大通于上海举行的第二十届全球中国峰会上&#xff0c;阿里巴巴集团联合创始人、董事局主席蔡崇信与摩根大通北亚区董事长兼大中华区投资银行业务副主席关金星&#xff08;Kam Shing Kwang&#xff09;进行了一场精彩对话。蔡崇信深入分享了他对公…

GitHub每周最火火火项目(6.10-6.16)

好的&#xff0c;以下是按照你的要求对每个项目进行的总结&#xff1a; 项目名称&#xff1a;roboflow / supervision 项目介绍&#xff1a;supervision 是一个用于计算机视觉的工具库&#xff0c;它提供了一系列的工具和函数&#xff0c;帮助用户更轻松地进行图像和视频数据的…

JAVA学习-练习试用Java实现“交错字符串”

问题&#xff1a; 给定三个字符串 s1、s2、s3&#xff0c;请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。 两个字符串 s 和 t 交错 的定义与过程如下&#xff0c;其中每个字符串都会被分割成若干 非空 子字符串&#xff1a; s s1 s2 ... sn t t1 t2 ... tm |n - m…

下载站名文件

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 得到了请求地址与请求参数后&#xff0c;可以发现请求参数中的出发地与目的地均为车站名的英文缩写。而这个英文缩写的字母是通过输入中文车站名转换…

Linux 文件的权限信息解读 chmod修改权限 数字序号表示权限

ls -l #列出当前文件 显示详细信息 drwxr-xr-x. 2 dpc test 6 Jun 15 07:45 test.txt共分为三部分 drwxr-xr-x.&#xff1a;表示文件和文件夹的权限信息dpc &#xff1a;文件&#xff0c;文件夹所属的用户test &#xff1a; 文件和文件夹所属的用户组 drwxr-xr-x 解读 d表示为…

LeetCode538.把二叉搜索树转换为累加树

class Solution { public:int sum 0; TreeNode* convertBST(TreeNode* root) { if (root){convertBST(root->right);sum root->val;root->val sum;convertBST(root->left);}return root;}};

hugo-magic主题使用教程(一)

前提条件 以下教程以windows10为例操作终端使用git bash魔法上网的前提下 下载hugo https://github.com/gohugoio/hugo/releases/download/v0.127.0/hugo_extended_0.127.0_windows-amd64.zip解压到任意目录,然后将目录添加到系统环境变量 如图 (windows)打开cmd 输入 hugo …

【CTS】android CTS测试

android CTS测试 1.硬件准备2. 软件准备3. 下载 CTS3.1 cts3.2 解压 CTS 包&#xff1a; 4 配置adb fastboot5 检查 Java 版本6 安装aapt26.1 下载并安装 Android SDK6.2 找到 aapt2 工具6.3 配置环境变量 7. 准备测试设备8. 运行 CTS 测试8.1 启动 CTS&#xff1a; 9. 查看测试…

Java面试八股之子类可以从父类继承哪些内容

Java子类可以从父类继承哪些内容 Java子类可以从父类继承以下内容&#xff1a; 属性&#xff08;Fields/Variables&#xff09;&#xff1a; public&#xff1a;子类可以继承父类所有的public修饰的属性。 protected&#xff1a;子类可以继承父类所有的protected修饰的属性…

uniapp中unicloud接入支付宝订阅消息完整教程

经过无数次的尝试,终于还是让我做出来了 准备工作 设置接口加签方式 使用支付宝小程序订阅消息,首先要设置接口加签方式,需要下载支付宝开放平台密钥工具,按照步骤生成秘钥,然后按照支付宝设置密钥加签方式添加接口加签方式。 有一点需要注意的,因为要在云函数中使用,…

github.com/therecipe/qt windows中安装

github.com/therecipe/qt windows中安装 a.准备好源码,解压到go/src/github.com/therecipe/qtwin下 b.设置cmd环境变量: set QT_DIRM:\work\tool\Qt5.14.2\5.14.2\mingw73_64 set QT_VERSION5.14.2 set QT_API5.13.0 set QT_QMAKE_DIRM:\work\tool\Qt5.14.2\5.14.2\mingw73_64\…

基于YOLOv5的钢材表面缺陷检测

配置环境 conda create -n yolo pip install -r requirements.txt -i https://repo.huaweicloud.com/repository/pypi/simple # 亲测华为云最稳定# 如果在下载时提示timeout,试试这句命令: pip --default-timeout=100 install -r requirements.txt -i https://repo.huaweicl…

STM32定时器篇——Systick定时器的使用(实现delay延时函数)

一、Systick定时器的简介&#xff1a; Systick定时器就是系统滴答定时器&#xff0c;一个24 位的倒计数定时器对于CM3,CM4内核芯片&#xff0c;都有Systick定时器。当Systick计到0时&#xff0c;将从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中…

AI数据分析:根据Excel表格数据进行时间序列分析

ChatGPT中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;要完成一个Python脚本编写的任务&#xff0c;具体步骤如下&#xff1a; 读取Excel表格&#xff1a;"F:\AI自媒体内容\AI行业数据分析\toolify月榜\toolify2023年-2024年月排行榜汇总数据.xlsx"…

如何设计网站

设计网站是一个复杂而又有趣的过程。一个好的网站设计不仅可以吸引用户的注意力&#xff0c;还能提供良好的用户体验。下面我将分享一些关于如何设计网站的基本原则。 首先&#xff0c;需要明确网站的目标和受众。在设计网站之前&#xff0c;你应该明确你的网站的目标是什么。你…

ROS-SLAM雷达

使用前准备工作 1、新建工作空间、编译功能包 以建立名字为rplidar_ws为例&#xff0c;终端输入 mkdir rplidar_ws cd rplidar_ws mkdir src cd src catkin_init_workspace rplidar_ros功能包&#xff1a;git下载。 https://github.com/Slamtec/rplidar_ros/ 然后把解压的…

Linux-Tomcat服务配置到系统服务

目录 前言一、系统环境二、配置步骤step1 了解环境的安装路径step2 配置生成tomcat.pid文件step3 配置tomcat.service文件 三、测试systemctl命令管理Tomcat服务3.1 systemctl命令启动Tomcat服务3.2 systemctl命令查看Tomcat服务3.3 systemctl命令关闭Tomcat服务3.4 systemctl命…