• 一个在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'))。 

    1. import clr
    2. import io
    3. import os
    4. import string
    5. clr.AddReference('System')
    6. clr.AddReference('System.Data')
    7. clr.AddReference('Business')
    8. from System import *
    9. from System.Data import *
    10. from Business import *
    11. def get_account_money_by_dt(account_id,date):
    12. db=Pub.db_name_mgr
    13. InitMoney=Pub.select_str(db,"select InitMoney from account where account_id="+account_id)
    14. cash=Pub.select_str(db,"select sum(amount_real) from tran where account_id="+account_id+" and tran_date<="+date)
    15. stock_amount=float.Parse("0")
    16. 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")
    17. for dr in table_stock.Rows:
    18. code_type=DBUtils.get_str(dr, "code_type");
    19. code=DBUtils.get_str(dr, "code");
    20. count=DBUtils.get_str(dr, "c");
    21. price=Pub.select_str(code_type+"\\"+code,"select close from data_day where dt<="+date+" order by dt desc limit 1")
    22. if price<>'':
    23. stock_amount=stock_amount+float.Parse(price)*float.Parse(count)
    24. if cash=="":
    25. cash="0"
    26. if InitMoney=="":
    27. InitMoney="0"
    28. return (float.Parse(InitMoney)+float.Parse(cash)+stock_amount).ToString("0.00")

    C#的说明

    加载Python环境

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

    1. public void init_py_lib()
    2. {
    3. engine = IronPython.Hosting.Python.CreateEngine();
    4. scope = engine.CreateScope();
    5. engine.Runtime.IO.SetOutput(Output,Encoding.Unicode);
    6. engine.SetTrace(on_trace);
    7. StringBuilder sb = new StringBuilder();
    8. sb.AppendLine(@"import sys ");
    9. sb.AppendLine(@"sys.path.append("".\py\Lib.zip"") ");
    10. sb.AppendLine(@"sys.path.append("".\scripts"") ");
    11. ScriptSource source = engine.CreateScriptSourceFromString(sb.ToString());
    12. source.Execute(scope);
    13. string init_py = Pub.exe_dir + @"\py\init.py";
    14. if (System.IO.File.Exists(init_py))
    15. {
    16. ScriptSource source_init = engine.CreateScriptSourceFromFile(init_py);
    17. source_init.Execute(scope);
    18. }
    19. }

    执行脚本

     

    1. public Boolean Execute(string script, out string msg, out IronPyErrors err, ExecRequest request)
    2. {
    3. msg = "";
    4. err = new IronPyErrors();
    5. StringBuilder sb = request.log;
    6. sb.AppendLine("开始 "+DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") );
    7. sb.AppendLine("------");
    8. try
    9. {
    10. last_trace_lineno = "";
    11. last_trace_result = "";
    12. ScriptSource source = engine.CreateScriptSourceFromString(script);
    13. CompiledCode cc = source.Compile(err);
    14. if (err.Items.Count > 0)
    15. {
    16. err.ToStringBuilder(sb);
    17. msg = "编译错误";
    18. sb.Append(msg);
    19. return false;
    20. }
    21. scope.SetVariable("request", request);
    22. Py.instance.Output.SetLength(0);
    23. string sql_err = DataAccess.DataConn.clear_err();
    24. cc.Execute(scope);
    25. Py.instance.Output.Flush();
    26. string print_s = Encoding.Unicode.GetString(Py.instance.Output.ToArray());
    27. sql_err = DataAccess.DataConn.clear_err();
    28. if (sql_err != "")
    29. sb.AppendLine(sql_err);
    30. sb.AppendLine(print_s);
    31. sb.AppendLine("------");
    32. msg = "运行完成 "+ DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") ;
    33. sb.Append(msg);
    34. return true;
    35. }
    36. catch (Exception e)
    37. {
    38. if (last_trace_lineno != "")
    39. msg = "trace line:" + last_trace_lineno;
    40. if (last_trace_result != "")
    41. msg = msg + " " + "trace:" + last_trace_result;
    42. msg = msg + " " + e.Message;
    43. sb.Append(msg);
    44. }
    45. return false;
    46. }
    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.IO;
    6. using Microsoft.Scripting;
    7. using Microsoft.Scripting.Hosting;
    8. using IronPython;
    9. using IronPython.Runtime;
    10. using IronPython.Modules;
    11. using IronPython.Compiler;
    12. using IronPython.Runtime.Exceptions;
    13. using IronPython.Hosting;
    14. using Business;
    15. namespace Mgr
    16. {
    17. public class Py
    18. {
    19. public static Py instance = null;
    20. public static void init()
    21. {
    22. if (instance != null)
    23. return;
    24. instance = new Py();
    25. instance.init_py_lib();
    26. }
    27. public ScriptEngine engine = null;
    28. public ScriptScope scope = null;
    29. public static string get_key(string name)
    30. {
    31. return name.Trim().ToLower();
    32. }
    33. public static Dictionary<string , ScriptSource> ScriptDict = new Dictionary<string , ScriptSource>();
    34. public string set_script(string id ,string script)
    35. {
    36. if (id == "")
    37. id = Guid.NewGuid().ToString();
    38. id = get_key(id);
    39. ScriptSource source = engine.CreateScriptSourceFromString(script);
    40. ScriptDict[id] = source;
    41. return id;
    42. }
    43. public string last_trace_lineno = "";
    44. public string last_trace_result = "";
    45. public TracebackDelegate on_trace(TraceBackFrame frame, string result, object payload)
    46. {
    47. last_trace_lineno = frame.f_lineno.ToString();
    48. last_trace_result = result;
    49. return on_trace;
    50. }
    51. public Boolean Compile(string script,out string msg, out CompiledCode cc, out IronPyErrors err)
    52. {
    53. msg = "";
    54. err = new IronPyErrors();
    55. cc = null;
    56. try
    57. {
    58. ScriptSource source = engine.CreateScriptSourceFromString(script);
    59. cc = source.Compile(err);
    60. msg = "编译完成";
    61. return true;
    62. }
    63. catch (Exception e)
    64. {
    65. msg = e.Message;
    66. }
    67. return false;
    68. }
    69. public Boolean Execute_cc(CompiledCode cc, out string msg, ExecRequest request)
    70. {
    71. msg = "";
    72. StringBuilder sb = request.log;
    73. sb.AppendLine("开始 " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
    74. sb.AppendLine("------");
    75. try
    76. {
    77. last_trace_lineno = "";
    78. last_trace_result = "";
    79. scope.SetVariable("request", request);
    80. Py.instance.Output.SetLength(0);
    81. string sql_err = DataAccess.DataConn.clear_err();
    82. cc.Execute(scope);
    83. Py.instance.Output.Flush();
    84. string print_s = Encoding.Unicode.GetString(Py.instance.Output.ToArray());
    85. sql_err = DataAccess.DataConn.clear_err();
    86. if (sql_err != "")
    87. sb.AppendLine(sql_err);
    88. sb.AppendLine(print_s);
    89. sb.AppendLine("------");
    90. msg = "运行完成 " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
    91. sb.Append(msg);
    92. return true;
    93. }
    94. catch (Exception e)
    95. {
    96. if (last_trace_lineno != "")
    97. msg = "trace line:" + last_trace_lineno;
    98. if (last_trace_result != "")
    99. msg = msg + " " + "trace:" + last_trace_result;
    100. msg = msg + " " + e.Message;
    101. sb.Append(msg);
    102. }
    103. return false;
    104. }
    105. public Boolean Execute(string script, out string msg, out IronPyErrors err, ExecRequest request)
    106. {
    107. msg = "";
    108. err = new IronPyErrors();
    109. StringBuilder sb = request.log;
    110. sb.AppendLine("开始 "+DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") );
    111. sb.AppendLine("------");
    112. try
    113. {
    114. last_trace_lineno = "";
    115. last_trace_result = "";
    116. ScriptSource source = engine.CreateScriptSourceFromString(script);
    117. CompiledCode cc = source.Compile(err);
    118. if (err.Items.Count > 0)
    119. {
    120. err.ToStringBuilder(sb);
    121. msg = "编译错误";
    122. sb.Append(msg);
    123. return false;
    124. }
    125. scope.SetVariable("request", request);
    126. Py.instance.Output.SetLength(0);
    127. string sql_err = DataAccess.DataConn.clear_err();
    128. cc.Execute(scope);
    129. Py.instance.Output.Flush();
    130. string print_s = Encoding.Unicode.GetString(Py.instance.Output.ToArray());
    131. sql_err = DataAccess.DataConn.clear_err();
    132. if (sql_err != "")
    133. sb.AppendLine(sql_err);
    134. sb.AppendLine(print_s);
    135. sb.AppendLine("------");
    136. msg = "运行完成 "+ DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") ;
    137. sb.Append(msg);
    138. return true;
    139. }
    140. catch (Exception e)
    141. {
    142. if (last_trace_lineno != "")
    143. msg = "trace line:" + last_trace_lineno;
    144. if (last_trace_result != "")
    145. msg = msg + " " + "trace:" + last_trace_result;
    146. msg = msg + " " + e.Message;
    147. sb.Append(msg);
    148. }
    149. return false;
    150. }
    151. public MemoryStream Output = new MemoryStream();
    152. public void init_py_lib()
    153. {
    154. engine = IronPython.Hosting.Python.CreateEngine();
    155. scope = engine.CreateScope();
    156. engine.Runtime.IO.SetOutput(Output,Encoding.Unicode);
    157. engine.SetTrace(on_trace);
    158. StringBuilder sb = new StringBuilder();
    159. sb.AppendLine(@"import sys ");
    160. sb.AppendLine(@"sys.path.append("".\py\Lib.zip"") ");
    161. sb.AppendLine(@"sys.path.append("".\scripts"") ");
    162. ScriptSource source = engine.CreateScriptSourceFromString(sb.ToString());
    163. source.Execute(scope);
    164. string init_py = Pub.exe_dir + @"\py\init.py";
    165. if (System.IO.File.Exists(init_py))
    166. {
    167. ScriptSource source_init = engine.CreateScriptSourceFromFile(init_py);
    168. source_init.Execute(scope);
    169. }
    170. }
    171. }
    172. public class IronPyErrorsItem
    173. {
    174. public string Message { get; set; }
    175. public int ErrorCode { get; set; }
    176. public Severity sev { get; set; }
    177. public SourceSpan Span { get; set; }
    178. public string get_info()
    179. {
    180. string line = "";
    181. line = Span.Start.Line.ToString() + "行" + Span.Start.Column.ToString() + "列";
    182. line = line + "(" + sev.ToString() +" " + ErrorCode.ToString()+"): ";
    183. line = line + Message;
    184. return line;
    185. }
    186. }
    187. public class IronPyErrors : ErrorListener
    188. {
    189. public List Items = new List();
    190. public void ToStringBuilder(StringBuilder sb)
    191. {
    192. foreach (IronPyErrorsItem i in Items)
    193. {
    194. sb.AppendLine(i.get_info());
    195. }
    196. }
    197. public override void ErrorReported(ScriptSource source, string message, Microsoft.Scripting.SourceSpan span, int errorCode, Microsoft.Scripting.Severity severity)
    198. {
    199. IronPyErrorsItem i = new IronPyErrorsItem{
    200. Message = message,
    201. ErrorCode = errorCode,
    202. sev = severity,
    203. Span = span
    204. };
    205. Items.Add(i);
    206. }
    207. }
    208. }

  • 相关阅读:
    JavaSE之注解
    利用CNN识别英文语音数字
    11、voc转yolo数据集、训练集验证集划分、修改xml文件
    理解JS函数之call,apply,bind
    C++ Reference: Standard C++ Library reference: C Library: cstdio: fputs
    SQL的delete和drop
    微信小程序开发实战 云音乐
    【owt-server】RTC视频接收调用流程学习笔记1: Call::CreateVideoReceiveStream 前后
    zotero文献管理工具安装使用
    灰狼算法Grey Wolf Optimizer跑23个经典测试函数|含源码
  • 原文地址:https://blog.csdn.net/withcsharp2/article/details/139710244