首頁 > 軟體

C#使用IronPython庫呼叫Python指令碼

2022-06-13 14:04:37

IronPython是一種在 .NET及 Mono上的 Python實現,由微軟的 Jim Hugunin所發起,是一個開源的專案,基於微軟的 DLR引擎。

IronPython的主頁: IronPython.net /

github站點:

IronLanguages/ironpython3: Implementation of Python 3.x for .NET Framework that is built on top of the Dynamic Language Runtime. (github.com)

IronLanguages/ironpython2: Implementation of the Python programming language for .NET Framework; built on top of the Dynamic Language Runtime (DLR). (github.com)

方式一:適用於python指令碼中不包含第三方模組的情況

1、執行語句

藉由IronPython,就可以利用.NET執行儲存在Python指令碼中的程式碼段。下面通過簡單的範例說明如何應用C#呼叫Python指令碼。

1、在VS中新建表單專案:IronPythonDemo

2、VS的選單中開啟“Nuget程式包管理器”

3、搜尋IronPython程式包並安裝

安裝後自動參照如下的DLL

4、在exe程式所在資料夾下建立Python指令碼。Python範例指令碼實現求兩個數的四則運算:

num1=arg1
num2=arg2
op=arg3
if op==1:
    result=num1+num2
elif op==2:
    result=num1-num2
elif op==3:
    result=num1*num2
else:
    result=num1*1.0/num2

設定IronPythonDemo.py檔案屬性為“複製到輸出目錄”

5、修改工程的組態檔App.config如下:

其中microsoft.scripting節點中設定了IronPython語言引擎的幾個屬性。

<?xml version="1.0" encoding="utf-8" ?>  
<configuration>  
  <configSections>  
    <section name="microsoft.scripting" type="Microsoft.Scripting.Hosting.Configuration.Section, Microsoft.Scripting"/>  
  </configSections>  
  <microsoft.scripting>  
    <languages>  
      <language names="IronPython;Python;py" extensions=".py" displayName="Python" type="IronPython.Runtime.PythonContext, IronPython"/>  
    </languages>  
  </microsoft.scripting>  
    <startup>   
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />  
    </startup>  
</configuration>

6、 繪製表單如下:

7、編寫計算的函數:

ScriptRuntime scriptRuntime = ScriptRuntime.CreateFromConfiguration();
ScriptEngine pyEngine = scriptRuntime.GetEngine("python");
ScriptSource source = pyEngine.CreateScriptSourceFromFile("IronPythonDemo.py");//設定指令碼檔案
ScriptScope scope = pyEngine.CreateScope();

try
{
    //設定引數
    scope.SetVariable("arg1", Convert.ToInt32(txtNum1.Text));
    scope.SetVariable("arg2", Convert.ToInt32(txtNum2.Text));
    scope.SetVariable("arg3", operation.SelectedIndex + 1);
}
catch (Exception)
{
    MessageBox.Show("輸入有誤。");
}

source.Execute(scope);
labelResult.Text = scope.GetVariable("result").ToString();
}

8、編譯執行可得計算結果(此處未做輸入的檢查)

2、執行函數

IronPythonDemo2.py

def main(arr):
  try:
    arr = set(arr)
    arr = sorted(arr)
    arr = arr[0:]
    return str(arr)
  except Exception as err:
    return str(err)

c#程式碼

ScriptEngine pyEngine = IronPython.Hosting.Python.CreateEngine();//建立Python直譯器物件
dynamic py = pyEngine.ExecuteFile(@"IronPythonDemo2.py");//讀取指令碼檔案
int[] array = new int[9] { 9, 3, 5, 7, 2, 1, 3, 6, 8 };
string reStr = py.main(array);//呼叫指令碼檔案中對應的函數
MessageBox.Show(reStr);


//或者

ScriptRuntime pyRuntime = IronPython.Hosting.Python.CreateRuntime(); //建立一下執行環境
dynamic obj = pyRuntime.UseFile("IronPythonDemo2.py"); //呼叫一個Python檔案
int[] array = new int[9] { 9, 3, 5, 7, 2, 1, 3, 6, 8 };
string reStr = obj.main(array);//呼叫指令碼檔案中對應的函數
MessageBox.Show(reStr);

方式二:適用於python指令碼中包含第三方模組的情況

C#程式碼

using System;
using System.Collections;
using System.Diagnostics;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            Process p = new Process();
            string path = "reset_ipc.py";//待處理python檔案的路徑,本例中放在debug資料夾下
            string sArguments = path;
            ArrayList arrayList = new ArrayList();
            arrayList.Add("com4");
            arrayList.Add(57600);
            arrayList.Add("password");
            foreach (var param in arrayList)//新增引數
            {
                sArguments += " " + sigstr;
            }

            p.StartInfo.FileName = @"D:Python2python.exe"; //python2.7的安裝路徑
            p.StartInfo.Arguments = sArguments;//python命令的引數
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.RedirectStandardInput = true;
            p.StartInfo.RedirectStandardError = true;
            p.StartInfo.CreateNoWindow = true;
            p.Start();//啟動程序

            Console.WriteLine("執行完畢!");

            Console.ReadKey();
        }
    }
}

python指令碼

# -*- coding: UTF-8 -*-
import serial
import time

def resetIPC(com, baudrate, password, timeout=0.5):
    ser=serial.Serial(com, baudrate, timeout=timeout)
    flag=True
    try:
        ser.close()
        ser.open()
        ser.write("n".encode("utf-8"))
        time.sleep(1)
        ser.write("rootn".encode("utf-8"))
        time.sleep(1)
        passwordStr="%sn" % password
        ser.write(passwordStr.encode("utf-8"))
        time.sleep(1)
        ser.write("killall -9 xxxn".encode("utf-8"))
        time.sleep(1)
        ser.write("rm /etc/xxx/xxx_user.*n".encode("utf-8"))
        time.sleep(1)
        ser.write("rebootn".encode("utf-8"))
        time.sleep(1)
    except Exception:
        flag=False
    finally:
        ser.close()
    return flag

resetIPC(sys.argv[1], sys.argv[2], sys.argv[3])

上面的python指令碼實現的是重啟IPC裝置,測試功能成功。

呼叫包含第三方模組的python指令碼時,嘗試過使用path.append()方式,偵錯有各種問題,最終放棄了,沒有研究。

到此這篇關於C#使用IronPython庫呼叫Python指令碼的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com