首页 > 编程语言 >一个在C#中集成Python的例子

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

时间:2024-06-15 23:01:42浏览次数:8  
标签:集成 err trace C# Python msg sb public string

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

标签:集成,err,trace,C#,Python,msg,sb,public,string
From: https://blog.csdn.net/withcsharp2/article/details/139710244

相关文章

  • C#开发-集合使用和技巧(二)Lambda 表达式介绍和应用
    C#开发-集合使用和技巧Lambda表达式介绍和应用C#开发-集合使用和技巧介绍简单的示例:集合查询示例:1.基本语法从主体语句上区分:1.主体为单一表达式2.主体是代码块(多个表达式语句)从参数上区分1.带输入参数的Lambda表达式2.不带输入参数的Lambda表达式特殊用法:2.......
  • Windows中搭建centos虚拟机和MySQL
    背景前一段时间,博主为了在家里搭建学习环境,想模拟一个生产环境,尝试了Windows安装WSL、Vmwareworkstationplayer安装Ubuntu、把Window删了直接装Ubuntu、把Ubuntu删了装回Windows(Windows一直无法安装到SSD,最后拆了电脑拔了机械硬盘才装成功)的多个阶段,发现还是Windows用的习惯......
  • 【JAVA开发笔记】实战演练,如何用EasyExcel导出表格,并且自定义合并单元格
    目录1.前言2.EasyExcel简介3.EasyExcel简单导出案例讲解3.1EasyExcel依赖引入3.2测试类创建3.3Excel导出实现4.EasyExcel合并单元案例讲解4.1实现自定义合并策略4.2 使用自定义合并策略5.总结1.前言项目上,需将一个列表数据导出Excel表格,并将指定列相同......
  • servlet数量太多,搞个轻量级springmvc
    这两天用jsp+servlet+MySQL开发了一个企业网站,后台和前台都有,功能已经实现了,现在总结发现,servlet是真的多,我这个系统有7个表,后台实现一遍增删改查,就得有28个servlet,而且还有前台的部分,servlet的数量真的太多了,想想看springmvc,其实是可以写一个轻量级的springmvc的。在Servl......
  • Spring基础 - SpringMVC请求流程和案例
    前文我们介绍了Spring框架和Spring框架中最为重要的两个技术点(IOC和AOP),那我们如何更好的构建上层的应用呢(比如web应用),这便是SpringMVC;SpringMVC是Spring在SpringContainerCore和AOP等技术基础上,遵循上述WebMVC的规范推出的web开发框架,目的是为了简化Java栈的web开发。......
  • 基于单片机智能停车系统的设计与实现(论文+源码)_kaic
     基于单机片智能停车系统摘要:随着私家车数量的迅速增加,大中城市的停车问题越来越严重,人们早已习惯了将问题交给手机来解决。因此,迫切需要设计一个智能停车管理系统来支持移动终端,使用户能够通过移动终端实现停车查询、预订和支付。与传统的停车管理系统相比,智能停......
  • 高校毕业设计管理系统的设计与实现(论文+源码)_kaic
    目  录第1章绪  论1.1课题研究目的和意义1.2国外发展状况1.3开发环境1.4本文研究的主要内容第2章技术概述2.1设计原理2.2系统设计模式选定2.3数据库介绍2.4Struts介绍2.5系统中所应用的脚本和Ajax技术第3章需求分析3.1项目概述3.1.1......
  • NBT | 基因注释质量评估新工具OMArK,超越BUSCO
    今年2月,NatureBiotechnology在线发表论文:QualityassessmentofgenerepertoireannotationswithOMArk,描述了一个用于评估蛋白质编码基因注释质量的OMArk软件包。许多研究直接依赖于从基因组组装中预测的蛋白质编码基因库(“蛋白质组”)来进行比较。这样做依赖于以下假设:所有......
  • Tropical Plants | 改进的日本晴单倍型基因组UQ_NIP
    昆士兰大学RobertJ.Henry教授团队利用改进的单倍型水平基因组组装揭示更多的水稻基因。本研究利用更准确的测序技术,分析组装了一个改进的单倍型水平水稻基因组。该改进的基因组组装包含了早期基因组序列中缺失的区域,并且基于更高的序列准确性注释了3000多个新的基因。这个单倍......
  • GB | 华中农大焦文标团队开发适用于植物基因组的基于图形的集成式分型算法
    今年4月,华中农业大学焦文标团队在GenomeBiology上发表论文:Acomprehensivebenchmarkofgraph‑basedgeneticvariantgenotypingalgorithmsonplantgenomesforcreatinganaccurateensemblepipeline,主要研究了基于图谱的植物基因组变异基因分型算法,并创建了一个准确的......