VB.NET 执行一个exe程序并实时获取返回值

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 属性设置为一个空字符串。
如果我的回答解决了您的问题,请采纳!

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/349733
  • 以下回答来自chatgpt:

    解决方案:

    首先,建议使用 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

说明:

  1. 使用ProcessStartInfo启动python.exe进程并执行your_script.py脚本,RedirectStandardOutput设为True表示重定向标准输出。
  2. 通过Process.Start()方法启动进程,并获取Process对象。
  3. 使用Do Loop循环不断读取StandardOutput流,并更新TextBox1显示输出内容。Application.DoEvents()用于UI刷新。
  4. 读完StandardOutput流后,使用WaitForExit()等待进程结束。
  5. finally更新TextBox1显示完整输出。

通过上述方法,可以在VB.NET中启动python脚本,并实时捕获其print输出内容。每隔5秒输出的值就会实时显示在TextBox1中。

请注意,如果python脚本会一直输出内容而不退出,上述代码会一直处于Do Loop循环中。可以根据需要设置超时机制等来终止进程。

希望这个示例能帮助到您在VB.NET中调用Python exe并获取实时输出。如果有任何其他问题,也请提出,我很乐意继续提供帮助。