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

news2024/11/26 4:25:56

一个在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 string

clr.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_mgr
  InitMoney=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.coloradmin.cn/o/1827368.html

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

相关文章

数据库 | 期末复习专题(HBUT 韩洪木)

总结&#xff1a; 考研数据库系统概论题目整理_若视图的属性来自聚集函数、表达式,则该视图是可以更新的。-CSDN博客 数据库系统概论 ---知识点大全&#xff08;期末复习版&#xff09;_数据库系统概论期末复习-CSDN博客 1.数据库系统&#xff08;DBS&#xff09;的组成&#…

第一篇:容器化的未来:从Docker的革命到云原生架构

容器化的未来&#xff1a;从Docker的革命到云原生架构 1. 引言 在当今快速演进的技术领域&#xff0c;容器化技术已经成为云计算和微服务架构的重要组成部分。该技术以其高效的资源利用率、快速的部署能力和卓越的隔离性能&#xff0c;彻底改变了软件开发和部署的方式。容器化…

【Pytorch】一文向您详细介绍 model.eval() 的作用和用法

【Pytorch】一文向您详细介绍 model.eval() 的作用和用法 下滑查看解决方法 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&#xff1a;985高校的普通本硕…

深入浅出談 隐马尔可夫的概念(1/ 2)

文章目录 一、说明二、Markov Chain三、Introduction四、State Sequence五、Comment六、介绍隐藏式马可夫法则。七、隐藏马尔可夫Introduction八、结论 一、说明 在许多机器学习的章节中&#xff0c;常常遇见 HMM &#xff0c;往往看到它的数学式子后&#xff0c;就当没看到似…

[Algorithm][贪心][K次取反后最大化的数组和][身高排序][优势洗牌][最长回文串]详细讲解

目录 1.K 次取反后最大化的数组和1.题目链接2.算法原理详解3.代码实现 2.身高排序1.题目链接2.算法原理详解3.代码实现 3.优势洗牌1.题目链接2.算法思路详解3.代码实现 4.最长回文串1.题目链接2.代码实现 1.K 次取反后最大化的数组和 1.题目链接 K 次取反后最大化的数组和 2.…

Qt状态机框架

概述 状态机框架提供了用于创建和执行状态图的类。这些概念和符号基于Harel的Statecharts:复杂系统的可视化形式(http://www.wisdom.weizmann.ac.il/~dharel/SCANNED.PAPERS/Statecharts.pdf)&#xff0c;也是UML状态图的基础。状态机执行的语义基于状态图XML (SCXML)(http://…

Ms08067安全实验室成功实施多家业务系统渗透测试项目

点击星标&#xff0c;即时接收最新推文 近日&#xff0c;Ms08067安全实验室针对多家公司重要系统实施渗透测试项目。公司网络信息系统的业务应用和存储的重要信息资产均较多&#xff0c;存在网络系统结构的复杂性和庞杂等特点&#xff0c;使得公司网络信息系统面临一定风险。项…

如何打开pak文件-翻译pak语言包

最近碰到一些程序的语言包是pak格式&#xff0c;用Notepad打开全是乱码&#xff0c;百度搜索了一下&#xff0c;pak是一种少见的压缩文件格式&#xff0c;是pak Quake系列游戏所采用的一种特殊压缩包格式&#xff0c;由Quake游戏公司开发&#xff0c;用高版本的winrar可以打开&…

新能源汽车高压上电、高压下电逻辑分析

高压上电逻辑 新能源汽车的上电分为高压上电和低压上电&#xff0c;高压上电流程一般理解为高压件通电的过程&#xff0c;具体流程如下&#xff1a; 1、点火开关处于ON档时&#xff0c;仪表盘点亮&#xff0c;低压电接通。 2、VCU、BMS、MCU等控制模块依次被唤醒并开始进行自检…

【因果推断python】38_预测模型1

目录 工业界中的机器学习 之前的部分涵盖了因果推理的核心。那里的技术是众所周知和成熟的。他们经受住了时间的考验。第一部分建立了我们可以依赖的坚实基础。用更专业的术语来说&#xff0c;第一部分侧重于定义什么是因果推理&#xff0c;哪些偏差会阻止相关性成为因果关系&…

ffmpeg封装和解封装介绍-(10)综合完成视频重编码为h265,解封装解码编码再封装

主函数逐句解析&#xff1a; 由于代码太多我们只解析主函数&#xff0c;&#xff08;其他封装函数见前面文章&#xff0c;同时用到了解码编码封装代码&#xff09;。 初始化和参数处理 int main(int argc, char* argv[]) {/// 输入参数处理string useage "124_test_x…

[Vulnhub]Wintermute LFI+SMTP+Screen+Structv2-RCE+Lxc逃逸

概要 靶机 192.168.8.104 信息收集 $ nmap 192.168.8.103 --min-rate 1000 -sC -sV 结果: Starting Nmap 7.92 ( https://nmap.org ) at 2024-06-15 05:54 EDT Nmap scan report for 192.168.8.103 (192.168.8.103) Host is up (0.035s latency). Not shown: 997 closed t…

docker 简单在线安装教程

1、配置阿里镜像源 wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo 2、指定版本安装docker 本次制定安装 docker 服务版本、客户端版本都为&#xff1a; 19.03.14-3.el7 yum -y install docker-ce-19.03.14-3.e…

动态规划的递归写法和递推写法详解

目录 动态规划的概念 动态规划的递归写法 动态规划的递推写法 动态规划的概念 动态规划是一种用来解决一类最优化问题的算法思想。简单来说&#xff0c;动态规划将一个复杂的问题分解成若干个子问题&#xff0c;通过综合子问题的最优解来得到原问题的最优解。需要注意的是&…

论文阅读笔记:Towards Higher Ranks via Adversarial Weight Pruning

论文阅读笔记&#xff1a;Towards Higher Ranks via Adversarial Weight Pruning 1 背景2 创新点3 方法4 模块4.1 问题表述4.2 分析高稀疏度下的权重剪枝4.3 通过SVD进行低秩逼近4.4 保持秩的对抗优化4.5 渐进式剪枝框架 5 效果5.1 和SOTA方法对比5.2 消融实验5.3 开销分析 6 结…

秋招突击——6/14——复习{(树形DP)树的最长路径,(单调队列优化DP)——最大子序和}——新作{四数之和}

文章目录 引言复习树形DP——树的最长路径实现代码答疑 单调队列优化DP——最大子序和个人实现思路参考思路分析实现代码 无重复最长字串思路分析实现代码 新作四数之和实现思路需要注意的问题 参考代码分析思路实现代码 总结 引言 今天好好看看树的最长的路径&#xff0c;自己…

《Deep learning practice》learning notes

学习笔记&#xff1a; 【公开课】旷视x北大《深度学习实践》&#xff08;28课时全&#xff09; R Talk | 旷视科技目标检测概述&#xff1a;Beyond RetinaNet and Mask R-CNN 文章目录 Lecture 1: Introduction to Computer Vision and Deep Learning&#xff08;孙剑&#x…

apt-get update和apt-get upgrade的区别

apt-get update apt-get update 命令用于更新本地软件包列表。具体来说&#xff0c;做了以下事情&#xff1a; ①从 /etc/apt/sources.list 文件和 /etc/apt/sources.list.d/ 目录下的所有文件中读取软件源配置。 ②连接到这些软件源&#xff0c;并下载最新的软件包列表。 ③将…

1832javaERP管理系统之车间计划管理Myeclipse开发mysql数据库servlet结构java编程计算机网页项目

一、源码特点 java erp管理系统之车间计划管理是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助采用了serlvet设计&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统采用web模式&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Mye…

欧洲杯赛况@20240615

点击标题下「蓝色微信名」可快速关注 欧洲杯首战&#xff0c;德国5:1狂胜苏格兰&#xff0c;大比分、红点套餐、超新星登场进球&#xff0c;好像这些能想到的元素都发挥了作用&#xff0c;作为东道主&#xff0c;聚集了天时地利人和&#xff0c;可以说是完美&#xff0c;这就是…