python - 如何从 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
解决方案
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;
推荐阅读
- php - 如何在循环中多次包含 Class 文件?
- git - 项目被 bitbucket 拒绝
- latex - Latex Includegraphs和逐项行空间
- phaser-framework - 当角色在 Phaser 中移动时无限循环背景?
- android - 数据解析返回一堆 url
- android - 如何在多个字段上设置错误消息?
- typoscript - Typo3 9.x:多语言 - 内容回退不起作用?
- javascript - StorageEvent 在 Office 加载项中如何工作?
- python - 运行 sqlite3 命令时 wxpython 关闭应用程序
- javascript - 如何在没有多个 try-catch 函数的情况下组合多个 RegEx 对象