wxpython 实时,重定向stdout输出到textctrl

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了wxpython 实时,重定向stdout输出到textctrl相关的知识,希望对你有一定的参考价值。

我使用wxpython 并且自定义了stdout重定向输出到一个textctrl (文本控件)
但是只有在程序执行完之后才全部一起输出,我想要它实时输出 ,应该怎么办? 能不能给我一个完整的案例。

以下是我的案例:

import sys,time
import wx

class RedirectText(object):
def __init__(self,aWxTextCtrl):
self.out=aWxTextCtrl

def write(self,string):
self.out.WriteText(string)

class MyForm(wx.Frame):

def __init__(self):
wx.Frame.__init__(self, None, wx.ID_ANY, "wxPython Redirect Tutorial")

# Add a panel so it looks the correct on all platforms
panel = wx.Panel(self, wx.ID_ANY)
log = wx.TextCtrl(panel, wx.ID_ANY, size=(300,100),
style = wx.TE_MULTILINE|wx.TE_READONLY|wx.HSCROLL)
btn = wx.Button(panel, wx.ID_ANY, 'Push me!')
self.Bind(wx.EVT_BUTTON, self.onButton, btn)

# Add widgets to a sizer
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(log, 1, wx.ALL|wx.EXPAND, 5)
sizer.Add(btn, 0, wx.ALL|wx.CENTER, 5)
panel.SetSizer(sizer)

# redirect text here
redir=RedirectText(log)
sys.stdout=redir

def onButton(self, event):
print "You pressed the button!"
time.sleep(5)
print "======End====="

# Run the program
if __name__ == "__main__":
app = wx.PySimpleApp()
frame = MyForm().Show()
app.MainLoop()

你不是sleep了嘛。。。如果你想要点了,他后台运行,不卡主线程,你可以开线程来实现打印,不过就不能用输出重定向了,wxpython子线程刷界面需要调用wx.callafter(方法,参数1,参数2,..),不然可能崩溃。
所以,你界面写一个刷界面的方法,然后点击的时候,开一个子线程来调用刷界面方法,当然用callafter框起来追问

恩,我有点明白了,谢谢。 你能给我一个完整的例子吗?

参考技术A 重定向的类可参考以下程序:

class RedirectText(object):
def __init__(self,aWxTextCtrl):
self.out=aWxTextCtrl

def write(self, string):
wx.CallAfter(self.out.WriteText, string)

如何将时间戳添加到 cronjob 输出的行并将 stdout 和 stderr 重定向到不同的进程和/或文件

【中文标题】如何将时间戳添加到 cronjob 输出的行并将 stdout 和 stderr 重定向到不同的进程和/或文件【英文标题】:How to add timestamps to lines of a cronjob output and redirect stdout and stderr to different processes and/or files 【发布时间】:2022-01-08 23:40:03 【问题描述】:

我已经为此花费了几个小时 - 将时间戳添加到 cronjobs 的输出行并将 stdout 和 stderr 重定向到单独的进程,然后再到单独的文件,偶然发现了几个陷阱。所以,我决定与外面的人分享我的知识,作为食谱。

【问题讨论】:

【参考方案1】:

所以,代码如下,我将进一步解释特殊性:

crontab sample

MAILTO=""

* * * * * ((/home/ilya/stdoutanderr.sh | ts "\%FT\%T\%z:" >> /srv/data/log/ilya-test-crontab-ts/stdout.log) 2>&1 | ts "\%FT\%T\%z:" >> /srv/data/log/ilya-test-crontab-ts/ts-stderr.log) 2>&1 | logger -t CRONOUT

使用 crontab -e 编辑您的 crontab。

首先,MAILTO="" 行用于禁止发送 cron 输出。如果您不阅读这些邮件 - 最好将其隐藏。

然后您会看到 cronjob 的示例,其中 stdoutanderr.sh 是 cronjob 本身,其余部分用于时间戳、分别记录 stderr 和 stdout 并将命令本身的任何错误输出到 syslog。

stdoutanderr.sh

#!/bin/bash
echo "Sample stdout at " $(date)
echo "Sample stderr at " $(date) >&2

如您所见,示例作业只是将一行输出到 stderr,另一行输出到 stdout,这里没什么特别的。

ts 是来自moreutils 包的实用程序,您应该安装它以使用这种方法(或者您可以将其模拟为一个函数 - 网络中有示例),作业的标准输出通过管道传输到然后附加到指定的文件中。所有这些都发生在括号中,所以在括号的输出中我们只有标准错误。

这是我不知道的第一个棘手部分 - 必须另外在 cronjob 命令行中转义 % 符号,否则该行的其余部分将变成命令的输入,所以充其量它不会t 按预期运行。如您所见 - ts 格式中的 % 符号前面有一个反斜杠。

否则,时间的格式被证明是健壮且信息丰富的,并变成以下:

2021-12-02T12:25:01+0000: Sample stdout at  Thu Dec 2 12:25:01 UTC 2021

您可以使用该格式并添加亚秒级时间分辨率,或者您需要的任何东西。请记住在 cron 中转义百分比符号。

然后为了方便起见,我们将 stderr 重定向到 stdout 以将其通过管道传递到另一个 ts 调用并附加到另一个文件。这是通过重定向2>&1 实现的。但请注意,crontab 使用 dash 而不是 bash 运行,|& 无法按预期工作,因此请使用长重定向。

然后外括号被关闭,剩下的输出(只有在破折号无法处理命令时才应该存在)将登陆到CRONOUT标签下的cron.log或syslog。不过,还没有测试过这一段。如果您启用了邮件和/或其他方式的 crontab 日志记录 - 您可能不需要这个。

玩得开心!

【讨论】:

以上是关于wxpython 实时,重定向stdout输出到textctrl的主要内容,如果未能解决你的问题,请参考以下文章

命令输出(stdout,stderr)未重定向到管道

使用系统命令将stdout和stderr输出重定向到文件在perl中不起作用[重复]

Linux学习笔记 -- stdin/stdout 重定向

perl输出重定向

从 bash 脚本本身将 stdout 的副本重定向到日志文件

输出重定向是不是按顺序写入 stdout 和 stderr 信息?