2014-09-10 46 views
0

我有一个python脚本读取从C#传递的数据表。但是,当我尝试在python脚本中获取变量的值..它不提取值。此问题仅适用于float类型的变量。当我尝试 实例获取(在Python脚本) “ERRORRATE” 的价值,它返回0.0值仅..虽然actaule值为37.55无法从C#窗口中的python脚本获得浮点值应用程序

// C#脚本

// dt is datatable from C# being passed to python 
var engine = Python.CreateEngine(); 
       ScriptScope scope = engine.CreateScope(); 

       ScriptRuntime runTime = Python.CreateRuntime(); 
       ScriptEngine pyEngine = runTime.GetEngine("py"); 
       MemoryStream ms = new MemoryStream(); 

       scope.SetVariable("dt",dtmp); 

       runTime.IO.SetOutput(ms, new StreamWriter(ms)); 
       ScriptSource ss = pyEngine.CreateScriptSourceFromString(
            txtPythonCode.Text.Trim(), 
             SourceCodeKind.Statements); 

       ss.Execute(scope); 
       dynamic v1 = scope.GetVariable("Error"); 
       dynamic v3 = scope.GetVariable<float>("ErrorRate"); 
       string str = ReadFromStream(ms); 

// Python script 

    import clr 
    clr.AddReference('System.Data') 
    from System import Data 
    from System.Data import DataTable 

    TW = "Button1" 
    TotalCnt =0; 
    ErrorRate = 0.0; 
    Error =0; 


    # Function definition is here 
    def GetErrorRate(erate,total): 
     ErrorRate = float(erate/TotalCnt)*100 
     print("Error rate - ",float(erate/TotalCnt)*100); 
     return; 

    for row in dt.Rows: 
     if TW == row[3]: 
      print("TotalCnt - ",TotalCnt)  
     elif row[3]=="X": 
      TotalCnt = TotalCnt +1 
     elif row[3]=="Y": 
      TotalCnt = TotalCnt +1 
     elif row[3]=="Z": 
      TotalCnt = TotalCnt +1 
     elif row[3]==" Wire": 
      print() 
     else: 
      TotalCnt = TotalCnt +1 
      Error = Error +1 

    GetErrorRate(Error,TotalCnt) 

真的不知道可能是什么原因的问题。

+0

至。如果'erate'和'TotalCnt'都是整数,那么'erate/TotalCnt'将使用**整数**除法计算,所以在执行**之前必须将其中至少一个转换为float **师。 – 2014-09-10 10:34:37

回答

1

由于观察到PM 2Ring,你可能在做整数除法。这意味着数字的任何小数部分被丢弃。现在你告诉我们的结果应该是37.55。为了得到你乘以100,所以erate/TotalCnt的结果应该是0.3755。如果这是一个整数除法,那么结果将是0。然后,您将此0转换为0.0float的构造函数,乘以100,您将得到结果0.0

解决方案非常简单,只需使用TotalCnt = 0.0而不是TotalCnt =0;。这将使TotalCnt变量float从开始,并且您将在每次使用它时执行浮点操作。

PS:你不需要如果你使用的是Python 2.x的那么`浮动(中心提供全方位/ TotalCnt)`可能不会做你希望它是什么用分号;声明后蟒蛇

+0

谢谢..它的工作现在..做了建议的变化 – user1291401 2014-09-10 10:55:03

+0

1更多的疑问..我如何从脚本返回值TotalCnt – user1291401 2014-09-10 10:56:02

+1

我假设你想要在你的C#程序中得到它。您可以使用与检索'ErrorRate'相同的机制,因此在'dynamic v1 = scope.GetVariable(“Error”)之后添加此行'dynamic totalCnt = scope.GetVariable (“TotalCnt”); );'应该做的伎俩。 – Raven 2014-09-10 11:06:18