C#执行保存在XML属性值里的Python脚本

5 篇文章 0 订阅

做了一下午这个程序,搞得我快要呕血了!Python语法十分严谨,严到变态的地步!少一个缩进,运行就失败,真是让人无语!这一点还是Javascript比较好!

下面是一个正常格式的Python函数(Python里面没有花括号,全靠缩进表示)

def cal():
    k = float(ArrayCan[0].Text); 
    u = float(ArrayCan[1].Text); 
    o = float(ArrayCan[2].Text); 
    f = float(ArrayCan[3].Text); 
    w = float(ArrayCan[4].Text); 
    if u < 10: 
      return 0.2014 + 0.086 * log10(k) - 0.053 * log10(u) - 0.0155 * o + 0.001 * f + 0.3567 * w; 
    else: 
      return 0.1893 + 0.075 * log10(k / u) - 0.01264 * o + 0.0005 * f + 0.3355 * w;

看见了吧,def是定义一个函数,cal是函数名,它是无参的,下面缩进的部分是函数体,在Python中非常喜欢使用冒号,冒号之后的内容相当于C#花括号中的内容

下面变态的部分来了,要把这一段代码放入XML的属性值中,这里面有空格,换行,还有小于号,我需要下面这些预备知识才能完成这个任务

首先是一些特殊字符在XML里面如何书写

&lt;           < 小于号 
&gt;          > 大于号 
&amp;     & 和 
&apos;    ' 单引号 
&quot;     " 双引号 

接着是换行,空格等在XML里面的写法

空格 (& #x0020;) 
Tab (& #x0009;) 
回车 (& #x000D;) 
换行 (& #x000A;)

记得用得时候要把"&"和"#"之间的" "去掉

预备知识整理完毕,下面开始干活,下图就是上面Python代码存入XML属性里的代码,之所以用图片是因为那些特殊定义符贴不进页面中,只得截图了!,下面的这个格式让我鏖战了一下午,唉~~


            var xmlDoc = _thisView.ReadEmpiricalXml();
            if (xmlDoc != null)
            {
                var xElement = xmlDoc.Element("Property");
                if (xElement != null)
                {
                    var formulaName =
                        xElement.Elements("FormulaInfo").Where(test => test.Attribute("FormulaName").Value == JYGSNAME);
                    var formulaElements = formulaName as IList<XElement> ?? formulaName.ToList();
                    if (formulaElements.Count > 0)
                    {
                        var code = formulaElements[0].Attribute("Code").Value;
                        if (!string.IsNullOrEmpty(code))
                        {
                            ScriptEngine engine = Python.CreateEngine();
                            ScriptScope scope = engine.CreateScope();
                            //导入Python中的Math模块
                            ScriptSource source = 
                                engine.CreateScriptSourceFromString("from math import *", SourceCodeKind.AutoDetect);
                            source.Execute(scope);

                            //执行公式
                            source = engine.CreateScriptSourceFromString(code);
                            //给Python中的变量赋值,ArrayCan是一个TextBox数组
                            scope.SetVariable("ArrayCan", ArrayCan);
                            source.Execute(scope);
                            //找到Python脚本中定义的cal函数
                            var func = scope.GetVariable<Func<double>>("cal");
                            //执行函数并返回结果
                            var result = func();
                        }
                    }
                }
            }
特别注意导入Python模块(类似c#命名空间)时,不能跟下面函数的脚本写在一起,要像上面一样,用二段代码分别导

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值