C#调用Python脚本的两种实现方式

阿麦
阿麦
发布时间:2026-10-13 | 4人浏览过
原创

本文介绍了在C#控制台程序中执行Python脚本的两种主要方法。第一种利用IronPython引擎直接调用,适用于无第三方依赖的简单脚本;第二种通过System.Diagnostics.Process启动Python解释器进程,支持包含第三方模块的复杂场景。文章提供了完整的C#与Python代码示例及注意事项。

C#调用Python脚本概述

由于项目需求,需要在C#控制台程序中执行Python脚本。经过查阅相关资料并实践,成功实现了调用功能,特此记录以便日后查阅。

前置准备:安装IronPython

本文仅演示两种调用方式:第一种适用于Python脚本不依赖第三方模块的场景;第二种则针对包含第三方模块的Python脚本。无论采用哪种方式,前提都是必须安装IronPython。可以通过Visual Studio 2017的工具菜单进入NuGet包管理器,搜索并安装IronPython包;或者从官网下载安装包,安装后手动添加引用即可。

方式一:直接调用(无第三方模块)

方式一:适用于Python脚本中不包含第三方模块的情况。

C#代码实现如下:

C#端代码


using IronPython.Hosting;
using Microsoft.Scripting.Hosting;
using System;

namespace CSharpCallPython
{
  class Program
  {
    static void Main(string[] args)
    {
      ScriptEngine pyEngine = Python.CreateEngine();//创建Python解释器对象
      dynamic py = pyEngine.ExecuteFile(@"test.py");//读取脚本文件
      int[] array = new int[9] { 9, 3, 5, 7, 2, 1, 3, 6, 8 };
      string reStr = py.main(array);//调用脚本文件中对应的函数
      Console.WriteLine(reStr);

      Console.ReadKey();
    }
  }
}

对应的Python脚本内容如下:

Python端代码


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

运行结果如图所示:

方式二:进程调用(含第三方模块)

方式二:适用于Python脚本中包含第三方模块的情况。

C#代码实现如下:

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:\Python2\python.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脚本内容如下:

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("root\n".encode("utf-8"))
    time.sleep(1)
    passwordStr="%s\n" % password
    ser.write(passwordStr.encode("utf-8"))
    time.sleep(1)
    ser.write("killall -9 xxx\n".encode("utf-8"))
    time.sleep(1)
    ser.write("rm /etc/xxx/xxx_user.*\n".encode("utf-8"))
    time.sleep(1)
    ser.write("reboot\n".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()方法修改路径,但调试过程中遇到诸多问题,最终放弃该方法,未做深入研究。

以上就是本文的全部内容,希望对读者的学习有所帮助,也欢迎大家继续支持本站。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表