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()
所以,你界面写一个刷界面的方法,然后点击的时候,开一个子线程来调用刷界面方法,当然用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输出重定向到文件在perl中不起作用[重复]