首页 > 解决方案 > 如何从 c# 应用程序运行 python 可执行文件(dummy.exe)

问题描述

如何从 c# 应用程序运行可执行的 python 文件(dummy.exe)?我可以使用类似的代码运行 .py 文件,如下所示

 private void run_cmd(string cmd, string args)
{
 ProcessStartInfo start = new ProcessStartInfo();
 start.FileName = cmd;//cmd is full path to python.exe
 start.Arguments = args;//args is path to .py file and any cmd line args
 start.UseShellExecute = false;
 start.RedirectStandardOutput = true;
 using(Process process = Process.Start(start))
 {
     using(StreamReader reader = process.StandardOutput)
     {
         string result = reader.ReadToEnd();
         Console.Write(result);
     }
 }
}

但是当我尝试将文件名作为 dummy.exe 的路径时,无法执行 .exe 文件。我只有一个文件(dummy.exe)。我没有使用 IronPython(除非这是唯一的方法,否则我不会更喜欢)

编辑:- 我没有 .py 文件,我只有 python 可执行文件(dummy.exe)文件。其他答案是关于将 .py 文件作为参数提供给 python.exe

编辑-我尝试了什么

static Process process = new Process();

        static void Main(string[] args)
        {


            //ProcessStartInfo process= new ProcessStartInfo();
            //process.FileName = @"C:\Users\wpuser\Downloads\dummy.exe";
            //process.UseShellExecute = false;

            //Process myprocess=Process.Start(process);


            //myprocess.OutputDataReceived += Process_OutputDataReceived;
            // var cmd = "C:/Users/user/Documents/script.py";

                


                process.StartInfo.FileName = @"C:\Users\wpuser\Downloads\dummy.exe";
                //Arguments = cmd,
                process.StartInfo.UseShellExecute = false;
                process.StartInfo.RedirectStandardOutput = true;
                process.StartInfo.RedirectStandardError = true;
                process.StartInfo.CreateNoWindow = true;
                
                process.EnableRaisingEvents = true;
            
            process.ErrorDataReceived += Process_OutputDataReceived;
            process.OutputDataReceived += Process_OutputDataReceived;
            process.Exited += Process_Exited;

            process.Start();
          //  process.BeginErrorReadLine();
          //  process.BeginOutputReadLine();
           // process.WaitForExit();
           // Console.Read();
            //while (true)
            //{
            //    Console.WriteLine("Me");
            //    Thread.Sleep(2000);
            //}
            

        }
        static void Process_OutputDataReceived(object sender, DataReceivedEventArgs e)
        {
             Led_status= e.Data;
            Console.WriteLine(Led_status);
            //Thread.Sleep(500);
        }

        static void Process_ErrorDataReceived(object sender, DataReceivedEventArgs e)
        {
            Console.WriteLine(e.Data + "\n");
        }
       static  void Process_Exited(object sender, EventArgs e)
        {
            Console.WriteLine("process exited with code {0}\n", process.ExitCode.ToString());
        }
    }
}

但我将 Led_status 设为空。这意味着 outputreceive 处理程序没有被触发,我猜是因为我没有在标准输出处重定向输出。但是我使用了 RedirectStandardOutput 属性,有人可以帮我吗?

编辑: - 谢谢大家,我得到它的工作!问题是,我没有 pythin dll

标签: pythonc#

解决方案


System.Diagnostics.Process如果您要处理的不是最琐碎的场景,那么使用起来可能会很烦人。包装外部命令行可执行文件的一种更简单的方法是使用CliWrap。以下是您可以为您的案例执行此操作的方法:

using CliWrap;
using CliWrap.Buffered;

var result = await Cli.Wrap(@"C:\Users\wpuser\Downloads\dummy.exe")
    .WithArguments("foo bar")
    .ExecuteBufferedAsync();

var exitCode = result.ExitCode;
var stdOut = result.StandardOutput;
var stdErr = result.StandardError;

推荐阅读