我有一个 python 程序,我在树莓派 4 上从控制台运行。
在程序中,有一些事件会在终端上生成一些输出。
第一个问题:是否有任何选项可以显示所有我的 python 程序的列表框中的终端输出?
也许将控制台输出写入文件,然后从文件中读取它以将其显示在我的程序上。
我读到了
tee
但我不确定它是如何工作的,以及如何仅重定向该终端输出,而不是所有在后台进行的终端活动。
第二个问题:如果我打开了多个终端,这会影响该过程吗?
谢谢!
好的,以下是如何解决将 Python 程序的终端输出重定向到文件并显示在程序自身的 GUI 中的方法,并解答的问题。
了解的需求
-
希望捕获 Python 程序打印到控制台(使用
print()
语句)的所有内容。 - 不希望捕获其他程序或后台进程的输出。
- 希望实时或接近实时地将此输出显示在 GUI 的列表框中。
解决方案:使用
subprocess
和线程
-
使用
subprocess
运行的脚本: 不要直接从控制台运行 Python 脚本,而是在主 GUI 应用程序中使用subprocess
模块。这使可以捕获其输出。 -
重定向标准输出和标准错误: 当使用
subprocess.Popen
时,将stdout
和stderr
重定向到PIPE
。这将允许读取输出。 -
使用线程进行非阻塞读取: 使用单独的线程从子进程读取输出。这可以防止的 GUI 冻结,同时等待输出。
-
更新列表框: 从线程中,将捕获的输出追加到的列表框中。
代码示例:
import tkinter as tk
import subprocess
import threading
class Application(tk.Frame):
def __init__(self, master=None):
super().__init__(master)
self.master = master
self.pack()
self.create_widgets()
self.run_script()
def create_widgets(self):
self.output_label = tk.Label(self, text="终端输出:")
self.output_label.pack()
self.output_listbox = tk.Listbox(self)
self.output_listbox.pack()
def run_script(self):
self.process = subprocess.Popen(
["python", "your_script.py"], # 替换为的脚本名称
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
text=True
)
# 创建一个线程来读取输出
thread = threading.Thread(target=self.read_output)
thread.daemon = True # 允许主线程在后台线程运行时退出
thread.start()
def read_output(self):
while True:
line = self.process.stdout.readline()
if not line:
break # 进程已完成
self.output_listbox.insert(tk.END, line.strip())
self.output_listbox.see(tk.END) # 自动滚动到底部
root = tk.Tk()
app = Application(master=root)
app.mainloop()
将 "your_script.py" 替换为实际的 Python 脚本文件名。
解答的问题:
- 问题 1: 是的,此代码演示了如何在列表框中显示终端输出。
- 问题 2: 打开多个终端不会影响此过程,因为直接从 GUI 应用程序中捕获特定脚本的输出。
其他注意事项:
- 错误处理: 可能希望实现更强大的错误处理,例如,检查子进程的返回代码。
-
GUI 框架:
此示例使用
tkinter
,但可以轻松地将其调整为其他 GUI 框架(如 PyQt 或 Kivy)。
请记住,这只是一个基本示例。根据的程序的复杂性和特定需求,可能需要调整代码。
标签:python,linux,raspberry-pi From: 78842397