zoukankan      html  css  js  c++  java
  • C#调用python脚本

      因项目需要,需要使用C#控制台程序执行python脚本,查询各种资料后可以成功调用了,记录一下,以备后面遗忘。

      只尝试了两种调用方式,第一种只适用于python脚本中不包含第三方模块的情况,第二种针对的是python脚本中包含第三方模块的情况。不管哪种方式,首先都需要安装IronPython。我是通过vs2017的工具->NuGet包管理器->管理解决方案的NuGet包,搜索IronPython包安装,也可以在官网下载安装包自行安装后添加引用即可。

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

    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脚本

    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#代码

    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("
    ".encode("utf-8"))
            time.sleep(1)
            ser.write("root
    ".encode("utf-8"))
            time.sleep(1)
            passwordStr="%s
    " % password
            ser.write(passwordStr.encode("utf-8"))
            time.sleep(1)
            ser.write("killall -9 xxx
    ".encode("utf-8"))
            time.sleep(1)
            ser.write("rm /etc/xxx/xxx_user.*
    ".encode("utf-8"))
            time.sleep(1)
            ser.write("reboot
    ".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()方式,调试有各种问题,最终放弃了,没有研究。

  • 相关阅读:
    jetnuke v1.2安装
    Java Gaming Resources
    @MyEclipse启动Tomcat时Console不显示(已解决+配图)
    在JXSE中,DHT=SRDI
    LINQ 学习笔记9 Kevin
    LINQ 学习笔记6 Kevin
    C# 中自定义事件 Kevin
    LINQ 学习笔记7 Kevin
    C#调用浏览器(默认和非默认浏览器) Kevin
    Section1 Agile Development Kevin
  • 原文地址:https://www.cnblogs.com/zoe-yan/p/10374757.html
Copyright © 2011-2022 走看看