当前位置: 首页 > news >正文

一个在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);}
}
}

相关文章:

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

一个在C#中集成Python的例子。在C#中可以执行Python脚本&#xff0c;在Python中也可以调用C#宿主中的功能&#xff08;clr.AddReference(Business)&#xff09;。 文件说明 Debug为执行目录 Mgr.exe为执行文件 Py\init.py为python初始化脚本 Py\Lib.zip为python需要的模块&…...

基于RandLA-Net深度学习模型的激光点云语义分割

一、场景要素语义分割部分的文献阅读笔记 RandLA-Net是一种高效、轻量级的神经网络&#xff0c;其可直接逐点推理大规模点云的语义标签。RandLA-Net基于随机点采样获得了显著的计算和内存效率&#xff0c;并采用新的局部特征聚合模块有效地保留了几何细节&#xff0c;弥补了随机…...

C语言的结构体与联合体

引言 C语言提供了结构体和联合体两种聚合数据类型&#xff0c;使得程序员可以创建包括多个数据类型的复杂数据结构。结构体用于将不同类型的数据组合成一个单元&#xff0c;而联合体用于在同一存储空间中存储不同类型的数据。本篇文章将详细介绍C语言中的结构体和联合体&#x…...

React Hooks小记(三)_forwardRef

forwardRef 【写在前面】 ​ 1、ref 的作用是获取实例&#xff0c;但由于函数组件不存在实例&#xff0c;因此无法通过 ref 获取函数组件的实例引用&#xff0c;而 React.forwardRef 就是用来解决这个问题的。 ​ 2、React.forwardRef 会创建一个 React 组件&#xff0c;这个组…...

面试复习记录

六级终于结束了&#xff0c;之前背的八股几乎也忘得差不多了&#xff0c;今天开始继续准备秋招&#xff0c;以下是每天的安排&#xff0c;会按时更新&#xff0c;就当是一种对自己的督促&#xff0c;也欢迎小伙伴们一起来互相监督。 2024.6.16 力扣&#xff1a;sql基础题库50…...

块级元素与行内元素详解

在网页设计与开发中&#xff0c;元素根据其在页面布局中的表现可分为两大类&#xff1a;块级元素&#xff08;Block-level Elements&#xff09;和行内元素&#xff08;Inline Elements&#xff09;。理解它们的特性和使用规则对于构建结构清晰、布局合理的网页至关重要。 块级…...

Kotlin编程实践-【Java如何调用Kotlin中带默认值参数的函数】

问题 如果你有一个带有默认参数值的 Kotlin 函数&#xff0c;如何从 Java 调用它而无须为每个参数显式指定值&#xff1f; 方案 为函数添加注解JvmOverloads。 也就是为Java添加重载方法&#xff0c;这样Java调用Kotlin的方法时就不用传递全部的参数了。 示例 在 Kotlin …...

中国城市统计年鉴(1985-2023年)

数据年限&#xff1a;1985-2023 数据格式&#xff1a;pdf、excel 数据内容&#xff1a;共分四个部分 第一部分是全国城市行政区划&#xff0c;列有不同区域、不同级别的城市分布情况&#xff1b; 第二、三部分分别是地级以上城市统计资料和县级城市统计资料&#xff0c;具体包括…...

RestTemplate远程请求的艺术

1 简说 编程是一门艺术,追求优雅的代码就像追求优美的音乐。 很多有多年工作经验的开发者,在使用RestTemplate之前常常使用HttpClient,然而接触了RestTemplate之后,却愿意放弃多年相处的“老朋友”,转向RestTemplate。那么一定是RestTemplate有它的魅力,有它的艺术风范。…...

Spring 整合 MyBatis 底层源码解析

大家好&#xff0c;我是柳岸花开。今天我们要讲的是 Spring 整合 MyBatis 的底层源码解析。希望大家能更深入理解 Spring 和 MyBatis 的整合原理&#xff0c;并应用到实际项目中。 由很多框架都需要和Spring进行整合&#xff0c;而整合的核心思想就是把其他框架所产生的对象放到…...

LeetCode 189.轮转数组

1.这个题我用的方法比较巧妙&#xff0c;大家如果觉得好的话&#xff0c;就给个免费的赞吧^ _ ^,谢谢了。 void reverse(int* nums,int left,int right) {while(left < right){int a nums[left];nums[left] nums[right];nums[right] a;left;right--;} } void rotate(int…...

JDK17 你的下一个白月光

JDK版本升级的非常快&#xff0c;现在已经到JDK20了。JDK版本虽多&#xff0c;但应用最广泛的还得是JDK8&#xff0c;正所谓“他发任他发&#xff0c;我用Java8”。 但实际情况却不是这样&#xff0c;越来越多的java工程师拥抱 JDK17&#xff0c;于是了解了一下 JDK17新语法&a…...

springboot优雅shutdown时如何保障异步线程的安全

我前面写了一篇springboot优雅shutdown的文章&#xff0c;看起来一切很美好。 https://blog.csdn.net/chenshm/article/details/139640775 那是因为没有进行多线程测试。如果一个请求中包括阻塞线程&#xff08;主线程&#xff09;和非阻塞线程&#xff08;异步线程&#xff09…...

C++格式化库fmt使用方法

1. 格式化库fmt简介 fmt github地址 api说明 格式化参数说明 内容的格式化&#xff0c;体现在代码中主要表现为字符串、基本类型、自定义类型的拼接。例如说打印日志、拼接变量等。C中我们会经常使用类似printf,snprintf(C风格使用不方便),std::string.append(繁琐), std::io…...

HTML 颜色名:网页设计的调色板

HTML 颜色名:网页设计的调色板 在网页设计和开发中,颜色是一个关键元素,它不仅影响视觉效果,还能传达情感和品牌信息。HTML 颜色名是用于在 HTML 和 CSS 代码中指定颜色的预定义名称。这些颜色名易于记忆,方便设计师和开发者快速选择和应用颜色。本文将详细介绍 HTML 颜色…...

12306 火车票价格解析 (PHP 解析)

1. 从接口拿数据 日期 出发站 终点站 都填上 xxx/otn/leftTicketPrice/queryAllPublicPrice?leftTicketDTO.train_date2024-06-15&leftTicketDTO.from_stationBJP&leftTicketDTO.to_stationSJP&purpose_codesADULT 返回的数据是这样的 {"validateMess…...

了解统计学中不同类型的分布

目录 一、说明 二、均匀分布&#xff1a; 三、机器学习和数据科学中的均匀分布示例&#xff1a; 3.1 对数正态分布&#xff1a; 3.2 机器学习和数据科学中的对数正态分布示例&#xff1a; 四、 帕累托分布 4.1 什么是幂律&#xff1f; 4.2 机器学习和数据科学中的帕累托分布示例…...

k8s-CCE创建工作负载变量引用

CCE创建工作负载变量引用 背景&#xff0c;看到cce创建负载时会生成变量&#xff0c;如下。在skywaking-agent的使用&#xff0c;想要调用cce负载变量生成service_name。 -Dskywalking.agent.authentication里含有敏感信息需要写到配置项。简单粗糙的都写到配置项好像不合适。…...

后端主流框架--Spring02

前言:上篇关于Spring的文章介绍了一些Spring的基本知识&#xff0c;此篇文章主要分享一下如何配置Spring环境&#xff0c;如何注入等。 Spring项目构建 导入Spring相关JAR包 <dependency><groupId>org.springframework</groupId><artifactId>spring…...

[数据集][目标检测]减速带检测数据集VOC+YOLO格式5400张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;5400 标注数量(xml文件个数)&#xff1a;5400 标注数量(txt文件个数)&#xff1a;5400 标注…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

企业如何增强终端安全?

在数字化转型加速的今天&#xff0c;企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机&#xff0c;到工厂里的物联网设备、智能传感器&#xff0c;这些终端构成了企业与外部世界连接的 “神经末梢”。然而&#xff0c;随着远程办公的常态化和设备接入的爆炸式…...