VB.NET 执行一个exe程序并实时获取返回值
python编写的exe程序,每隔5秒print一个值,想实现用VB.NET调用这个exe执行,实时获取exe执行时返回的值(print内容),主要是vb代码如何实现,用shell只能返回程序ID。
需要的是实时读取,而不是等程序执行完后再一起返回内容
求帮忙
你可以使用 Process
类来执行该exe程序并实时获取返回值。以下是示例代码:
Dim process As New Process()
With process.StartInfo
.FileName = "path/to/your/python/exe/program.exe"
.UseShellExecute = False '需设置为False以重定向标准输出
.RedirectStandardOutput = True '重定向标准输出
.CreateNoWindow = True '不创建新窗口
End With
process.Start()
Dim output As String = ""
While Not process.StandardOutput.EndOfStream
output &= process.StandardOutput.ReadLine() & vbCrLf '实时读取
'可以在这里对读取到的内容做其他处理
'比如可以在UI界面上展示读取到的内容
End While
process.WaitForExit()
通过以上代码,你可以实现用VB.NET调用这个exe执行,并实时获取exe执行时返回的值(print内容)。在每次读取完输出时你可以对其进行任何你想要的处理,比如将其展示在UI界面上。
控制台‘
static void Main(string[] args)
{
//接收传过来的待压缩文件路径
string url = "";
//返回压缩过后的文件路径
string retUrl = "";
if (!string.IsNullOrEmpty(args[0]))
{
url = args[0];
}
//此处引用了一个压缩文件的dll using Ionic.Zip;
using (ZipFile zf = new ZipFile(System.Text.Encoding.Default))
{
zf.AddDirectory(url);
zf.Save(@"D:\zhai\aaa\"+DateTime.Now.ToString("yyyyMMddHHmmss")+".zip");
retUrl = @"D:\zhai\aaa\"+DateTime.Now.ToString("yyyyMMddHHmmss")+".zip";
}
Console.Write(retUrl);
}
以下答案由GPT-3.5大模型与博主波罗歌共同编写:
你可以使用 Process
类来启动一个外部应用程序并获取其输出。以下是一个示例:
Dim proc As New Process()
proc.StartInfo.FileName = "python.exe"
proc.StartInfo.Arguments = "your_python_script.py"
proc.StartInfo.UseShellExecute = False
proc.StartInfo.RedirectStandardOutput = True
proc.Start()
While Not proc.StandardOutput.EndOfStream
Dim line As String = proc.StandardOutput.ReadLine()
Console.WriteLine(line)
' 这里可以对获取的每一行输出进行操作
End While
在这个示例中,我们使用 Process
类来启动一个名为 python.exe
的外部程序,并传递一个名为 your_python_script.py
的参数。我们还设置了 RedirectStandardOutput
属性来捕获外部程序的标准输出,并使用一个 while 循环来读取每一行输出并进行操作。
如果你想要启动一个不需要参数的外部程序,你可以将 Arguments
属性设置为一个空字符串。
如果我的回答解决了您的问题,请采纳!
解决方案:
首先,建议使用 Process 类来启动 Python 编写的 .exe 程序。通过使用该类,我们可以方便地管理该进程,包括启动、停止、获取输出等操作。
示例代码如下:
Dim process As New Process()
process.StartInfo.FileName = "<path_to_exe_file>"
process.StartInfo.Arguments = "<arguments>"
process.StartInfo.UseShellExecute = False
process.StartInfo.RedirectStandardOutput = True
process.Start()
Dim output As String = process.StandardOutput.ReadToEnd()
在以上代码中,<path_to_exe_file>
表示你的 Python 编写的 .exe 程序的完整路径,<arguments>
表示你要传递给该程序的参数,这里可以省略。RedirectStandardOutput
属性设置为 True 表示可重定向标准输出流,ReadToEnd()
方法用于获取整个输出内容。
通过上述代码,我们可以启动程序并获取其输出内容。不过,由于你的程序每隔 5 秒会输出一个值,如果想要实时读取程序的输出内容,需要在程序运行期间不断地读取其输出流。这里可以使用异步方式实现,代码示例如下:
Dim process As New Process()
process.StartInfo.FileName = "<path_to_exe_file>"
process.StartInfo.Arguments = "<arguments>"
process.StartInfo.UseShellExecute = False
process.StartInfo.RedirectStandardOutput = True
AddHandler process.OutputDataReceived, AddressOf process_OutputDataReceived
process.Start()
process.BeginOutputReadLine()
Sub process_OutputDataReceived(ByVal sender As Object, ByVal e As DataReceivedEventArgs)
Dim output As String = e.Data
' 在这里处理输出内容,例如加入到 UI 控件中展示。
End Sub
在上述代码中,我们使用 BeginOutputReadLine()
方法来异步读取程序的输出流,并通过事件处理函数 process_OutputDataReceived()
来处理输出内容。需要注意的是,每次读取的内容可能不完整,因此需要在输出内容中添加标记来标识一段完整的信息,并在读取到该标记后再进行处理。
以上便是实现在 VB.NET 中调用一个正在运行的 Python 编写的 .exe 程序,并实时获取程序的返回值的方法。
以下答案由GPT-4.5Plus大模型(语音)与博主A努力中.......共同编写:
在VB.NET中调用外部exe程序并实时获取其输出,可以使用ProcessStartInfo和Process类的Start方法启动进程,然后通过Process.StandardOutput.ReadToEnd()方法实时读取输出。具体代码如下:
vb
Imports System.Diagnostics
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim psi As New ProcessStartInfo("python.exe", "your_script.py")
psi.RedirectStandardOutput = True
psi.UseShellExecute = False
psi.CreateNoWindow = True
Dim process As Process = Process.Start(psi)
Dim output = ""
Do
output += process.StandardOutput.ReadToEnd()
TextBox1.Text = output
Application.DoEvents() '刷新UI
Loop While Not process.StandardOutput.EndOfStream
process.WaitForExit()
TextBox1.Text = output
End Sub
End Class
说明:
通过上述方法,可以在VB.NET中启动python脚本,并实时捕获其print输出内容。每隔5秒输出的值就会实时显示在TextBox1中。
请注意,如果python脚本会一直输出内容而不退出,上述代码会一直处于Do Loop循环中。可以根据需要设置超时机制等来终止进程。
希望这个示例能帮助到您在VB.NET中调用Python exe并获取实时输出。如果有任何其他问题,也请提出,我很乐意继续提供帮助。