vb.net-将输出重定向到表单文本框
我正在尝试在vb.net项目中读取/使用python程序的输出,到目前为止,我没有得到任何结果。我想看到的是python程序运行(首先只运行它自己),所有的输出被重定向到一个文本框中 我看过其他一些关于这方面的帖子,但我要么遗漏了什么,要么不理解什么,因为我得到的只是空白输出。 公开课表格1vb.net-将输出重定向到表单文本框,vb.net,process,Vb.net,Process,我正在尝试在vb.net项目中读取/使用python程序的输出,到目前为止,我没有得到任何结果。我想看到的是python程序运行(首先只运行它自己),所有的输出被重定向到一个文本框中 我看过其他一些关于这方面的帖子,但我要么遗漏了什么,要么不理解什么,因为我得到的只是空白输出。 公开课表格1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim PythonPath = "C:\Python27\"
Dim strPath As String = Application.StartupPath
MessageBox.Show(PythonPath & "python.exe """ & strPath & "\Resources\import_logs.py"" ")
Dim start_info As New ProcessStartInfo(TextBox1.Text)
' Make the process and set its start information.
Dim process As New Process()
process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
process.StartInfo.FileName = PythonPath & "\python.exe"
process.StartInfo.Arguments = """" & strPath & "\resources\import_logs.py"""""
process.StartInfo.UseShellExecute = False
process.StartInfo.CreateNoWindow = True
process.StartInfo.RedirectStandardOutput = True
'process.StartInfo.RedirectStandardError = True
AddHandler process.OutputDataReceived, AddressOf proccess_OutputDataReceived
process.Start()
process.BeginOutputReadLine()
End Sub
Public Sub proccess_OutputDataReceived(ByVal sender As Object, ByVal e As DataReceivedEventArgs)
On Error Resume Next
' output will be in string e.Data
' modify TextBox.Text here
'Server_Logs.Text = e.Data ` Does not display anything in textbox
MsgBox(e.Data) 'It works but I want output in text box field
End Sub
End Class
最后,我将把参数传递给python脚本,我希望得到可以使用的反馈(将错误插入数据库、完成时发送电子邮件等),因此我希望它在运行时捕获流程,而不仅仅是在最后进行数据转储
任何帮助都将不胜感激。首先,难怪您不确定代码出了什么问题,您正在消除所有可能有助于诊断的错误。这是VB.NET中“错误恢复下一步”的唯一目的。非结构化错误处理只是为了向后兼容VB的.NET之前版本,现在是时候忘记它曾经存在过了。您当然不想在代码中使用它。(我会说“在您正在调试的代码中”,但所有代码都是调试的潜在候选代码,忽略错误是愚蠢的。) 不管怎么说,我们来谈谈具体的问题。我们知道对
MsgBox
的调用是有效的,但是当您开始与表单上的控件交互时,它就不能正常工作。所以那里有些东西正在崩溃
事实证明,OutputDataReceived
事件是在一个完全不同的线程上引发的,该线程与用于创建进程的线程不同,与运行应用程序UI的线程不同。它实际上只是从系统线程池中检索一个线程
这就是问题所在:除了创建这些对象的线程之外,您不能在其他线程上操作UI对象(至少不能不跳过一些环),这正是您的代码在这里试图做的。事实上,您可能正在接受一个异常,该异常相当迟钝地通知您这种情况
简单的解决方法是将进程
类的属性设置为一个UI组件(如表单或要输出到的特定控件)。这将强制所有事件处理程序在创建该组件的同一线程上执行。在这一点上,您的代码应该可以正常工作,因为您没有尝试进行任何跨线程UI访问。(消息框不易受此攻击,因为任何线程都可以显示消息框。您没有尝试访问绑定到其他线程的现有UI对象。)
或者,您可以通过使用委托和BeginInvoke
方法在事件处理程序方法中自己处理编组,但这对我来说似乎是不必要的工作