堆栈溢出.再一次,我在一个迫切需要的时候来找你,在疯狂的边缘岌岌可危地摇摇欲坠.这个问题 - 从标题中可以看出 - 是我在这里回答的其他几个问题的合并.
我有一个PyQt应用程序,我想将stdout和stderr流重新路由到我的GUI中的QTextEdit,没有延迟.
最初,我发现以下堆栈溢出答案: https ://stackoverflow.com/a/17145093/629404
这很有效,但有一点需要注意:如果在CPU处理相对较长的方法时多次更新stdout或stderr,则当主线程返回到应用程序循环时,所有更新都会同时显示.不幸的是,我有一些方法需要20秒才能完成(网络相关),因此应用程序变得无响应 - 并且QTextEdit不会更新 - 直到它们完成.
为了解决这个问题,我将所有GUI处理委托给主线程,并且我已经产生了第二个线程以处理更长的网络操作,使用pyqtSignals通知主线程工作何时完成并通过回来的结果.当我开始测试以这种方式编写的代码时,python解释器立刻开始崩溃而没有任何警告.
这是非常令人讨厌的地方:Python正在崩溃,因为 - 使用上面包含的链接中的类 - 我已经将sys.stdout/err流分配给QTextEdit小部件; PyQt小部件不能从除应用程序线程之外的任何线程修改,并且由于对stdout和stderr的更新来自我创建的辅助工作线程,因此它们违反了此规则.我已经注释掉了我重定向输出流的代码部分,果然,程序运行没有错误.
这让我回到原点,让我陷入困惑的境地; 假设我继续在主线程中处理GUI相关操作并处理辅助线程中的计算和更长时间的操作(我已经理解这是在用户触发事件时阻止应用程序阻塞的最佳方法),我该怎么办将Stdout和Stderr从两个线程重定向到QTextEdit小部件?上面链接中的类对于主线程来说效果很好,但是当更新来自第二个线程时,由于上述原因会杀死python.
我刚切换到monolog并想将我的消息记录到PHP控制台而不是文件.对于某些人来说这似乎是显而易见的,但我花了一点时间才弄清楚如何做到这一点,我在SO上找不到类似的问题/答案.
Monolog的Github自述文件中的示例仅显示如何使用文件:
<?php
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
// create a log channel
$log = new Logger('name');
$log->pushHandler(new StreamHandler('path/to/your.log', Logger::WARNING)); // <<< uses a file
// add records to the log
$log->addWarning('Foo');
$log->addError('Bar');
Run Code Online (Sandbox Code Playgroud)
但它没有说明如何将消息记录到控制台.在谷歌上搜索之后,我登陆了Symphony的帮助页面,或者是寻找登录浏览器控制台的人的问题.
在我的C程序中,我想暂时将STDOUT重定向到"/ dev/null"(例如).然后写入"/ dev/null"后我想恢复STDOUT.我该如何管理?
有没有办法告诉curl输出错误到stderr,以及stdout的其他一切?
原因是我每天晚上都使用命令行中的curl(实际上是一个cronjob)将文件上传到FTP站点.不幸的是因为curl在stderr上输出状态信息,所以当没有任何实际出错时,我收到一封关于错误的电子邮件.(我正在将stdout重定向到日志文件,但是保持stderr不变,这样如果有任何输出,cron会通过电子邮件发送给我.)
有一些选项可以使curl保持静默,或者将所有内容输出到stdout,但是这两种选择都可以防止错误出现在stderr上 - 这意味着当我想知道实际出现错误时,我不会收到电子邮件.
那么有没有办法让curl只在stderr上输出错误,但是在stdout上保持正常输出不变?
我有一个Python脚本,它使用'Print'打印到stdout.我最近通过Python Logger添加了日志记录,并希望如果启用了日志记录,这些打印语句将转到logger.我不想修改或删除这些打印语句.
我可以通过'log.info("some info msg")'来记录.我希望能够做到这样的事情:
if logging_enabled:
sys.stdout=log.info
print("test")
Run Code Online (Sandbox Code Playgroud)
如果启用了日志记录,则应记录"test",就像我执行log.info("test")一样.如果未启用日志记录,则只应将"test"打印到屏幕上.
这可能吗?我知道我可以以类似的方式将stdout指向文件(请参阅:重定向打印到日志文件)
我想检查子进程是否已成功执行或失败.目前我已经提出了一个解决方案,但我不确定它是否正确可靠.是否保证每个进程仅向stderr输出其错误stdout:
注意:我对重定向/打印输出不感兴趣.我知道该怎么做.
pipe = subprocess.Popen(command,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
universal_newlines=True)
if "" == pipe.stdout.readline():
print("Success")
self.isCommandExectutionSuccessful = True
if not "" == pipe.stderr.readline():
print("Error")
self.isCommandExectutionSuccessful = True
Run Code Online (Sandbox Code Playgroud)
或者:
if "" == pipe.stdout.readline():
print("Success")
self.isCommandExectutionSuccessful = True
else:
print("Error")
self.isCommandExectutionSuccessful = False
Run Code Online (Sandbox Code Playgroud)
和:
if not "" == pipe.stderr.readline():
print("Success")
self.isCommandExectutionSuccessful = True
else:
print("Error")
self.isCommandExectutionSuccessful = False
Run Code Online (Sandbox Code Playgroud) 我以为我将使用以下代码从QProcess获取输出:
// Start the process
process.start(tr("php-cgi www/test.php"),QIODevice::ReadWrite);
// Wait for it to start
if(!process.waitForStarted())
return 0;
// Continue reading the data until EOF reached
QByteArray data;
while(process.waitForReadyRead())
data.append(process.readAll());
// Output the data
qDebug(data.data());
qDebug("Done!");
Run Code Online (Sandbox Code Playgroud)
我期待的是看到程序的输出打印到调试控制台,但我看到的只有:
完成!
我知道:
我在这做错了什么?
如果这是我的子流程:
import time, sys
for i in range(200):
sys.stdout.write( 'reading %i\n'%i )
time.sleep(.02)
Run Code Online (Sandbox Code Playgroud)
这是控制和修改子进程输出的脚本:
import subprocess, time, sys
print 'starting'
proc = subprocess.Popen(
'c:/test_apps/testcr.py',
shell=True,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE )
print 'process created'
while True:
#next_line = proc.communicate()[0]
next_line = proc.stdout.readline()
if next_line == '' and proc.poll() != None:
break
sys.stdout.write(next_line)
sys.stdout.flush()
print 'done'
Run Code Online (Sandbox Code Playgroud)
为什么readline和communicate等待,直到程序完成后运行?有没有一种简单的方法来传递(和修改)子进程'stdout实时?
顺便说一下,我已经看过了,但是我不需要记录功能(并且没有太多的了解它).
我在Windows XP上.
我有一个正在运行的cron工作,它将持续一段时间,我想查看它的stdout.我不知道这个过程是由cron启动的重要性,但我想我会提到它.这是在OSX上,所以,我无法访问像.../proc/[pid]/...,或truss,或strace这样的东西.使用IO重定向(例如script > output & tail -f output)执行的建议是不可接受的,因为此过程已经1)已经运行,并且2)无法通过重定向停止/重新启动.如果有一些通用解决方案适用于各种Unices,那将是理想的,但具体而言我现在正试图在Mac上实现这一点.
如何使用python子进程模块复制以下批处理命令?
myprogram < myinput.in > myoutput.out
Run Code Online (Sandbox Code Playgroud)
换句话说,如何myprogram使用myinput.in标准输入和myoutput.out标准输出的内容运行?