Can';t通过ProcessStartInfo获取python文件到vb.net的实时输出
嗨,我知道这里已经有很多相同的问题了,但我尝试了其中的每一个,似乎无法理解为什么它不起作用 这是我的密码Can';t通过ProcessStartInfo获取python文件到vb.net的实时输出,python,vb.net,thread-safety,output,Python,Vb.net,Thread Safety,Output,嗨,我知道这里已经有很多相同的问题了,但我尝试了其中的每一个,似乎无法理解为什么它不起作用 这是我的密码 Private Sub CallbackProcessAsync(sender As Object, args As System.Diagnostics.DataReceivedEventArgs) Console.WriteLine(args.Data) Me.Invoke(Sub() statusRichText.AppendText(arg
Private Sub CallbackProcessAsync(sender As Object, args As System.Diagnostics.DataReceivedEventArgs)
Console.WriteLine(args.Data)
Me.Invoke(Sub() statusRichText.AppendText(args.Data & Environment.NewLine))
End Sub
Sub SuperUpload()
Dim oProcess As New Process()
AddHandler oProcess.ErrorDataReceived, AddressOf CallbackProcessAsync
AddHandler oProcess.OutputDataReceived, AddressOf CallbackProcessAsync
Dim oStartInfo As New ProcessStartInfo("C:\Users\RKjetski\AppData\Local\Programs\Python\Python37\python.exe", "test.py " + vInfoIframe.Text + " " + vInfoID.Text)
oStartInfo.UseShellExecute = False
oStartInfo.CreateNoWindow = True
oStartInfo.RedirectStandardError = True
oStartInfo.RedirectStandardOutput = True
oProcess.EnableRaisingEvents = True
oProcess.StartInfo = oStartInfo
oProcess.Start()
oProcess.BeginErrorReadLine()
oProcess.BeginOutputReadLine()
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles btnSuperUpload.Click
Dim thread = New System.Threading.Thread(AddressOf SuperUpload)
thread.Start()
End Sub
python文件
import time
x = 0
while x < 5:
print(x)
time.sleep(2)
x = x +1
导入时间
x=0
当x<5时:
打印(x)
时间。睡眠(2)
x=x+1
我得到以下输出,但它不是实时的,富文本框是空的,直到它读取程序,然后立即打印所有内容。
0
1.
2.
3.
4拆下螺纹。您的流程此时已经是事件驱动的(已经是异步的)。对
OutputDataReceived
和ErrorDataReceived
使用两个不同的处理程序(更容易确定发生了什么)。将BeginInvoke()与委托一起使用(例如,BeginInvoke(新方法调用程序(Sub()statusRichText.AppendText(…)End Sub))
)。仅用于引发已退出的事件(…)。(…)的异步版本。向退出的事件添加一个处理程序(您也可以在其中处置进程对象)或使用WaitForExit
(此处使用前者)。你可以遵循这种模式:(C#代码,但要遵循那里的注释。尽管代码很简单)仍然没有让它工作,似乎是一样的。如果我在OutputDataReceive上添加1秒的暂停,那么它会一行一行地打印出来,所以我不明白为什么它还要等待加载整个脚本?在这里发布了更新的代码,刚刚注意到当ffmpeg运行它的脚本时,它似乎在我的错误处理程序上工作?不确定是否假定输出为错误tho?