标签: stdout

将stdout和stderr从辅助线程重定向到PyQt4 QTextEdit

堆栈溢出.再一次,我在一个迫切需要的时候来找你,在疯狂的边缘岌岌可危地摇摇欲坠.这个问题 - 从标题中可以看出 - 是我在这里回答的其他几个问题的合并.

我有一个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.

python multithreading stdout pyqt thread-safety

26
推荐指数
1
解决办法
1万
查看次数

PHP:如何使用monolog登录到控制台(php:// out)?

我刚切换到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的帮助页面,或者是寻找登录浏览器控制台的人的问题.

php console stdout monolog

26
推荐指数
2
解决办法
2万
查看次数

我怎么能临时将stdout重定向到C程序中的文件?

在我的C程序中,我想暂时将STDOUT重定向到"/ dev/null"(例如).然后写入"/ dev/null"后我想恢复STDOUT.我该如何管理?

c redirect stdout

25
推荐指数
1
解决办法
2万
查看次数

使curl向stderr发送错误,将其他所有内容发送到stdout

有没有办法告诉curl输出错误到stderr,以及stdout的其他一切?

原因是我每天晚上都使用命令行中的curl(实际上是一个cronjob)将文件上传到FTP站点.不幸的是因为curl在stderr上输出状态信息,所以当没有任何实际出错时,我收到一封关于错误的电子邮件.(我正在将stdout重定向到日志文件,但是保持stderr不变,这样如果有任何输出,cron会通过电子邮件发送给我.)

有一些选项可以使curl保持静默,或者将所有内容输出到stdout,但是这两种选择都可以防止错误出现在stderr上 - 这意味着当我想知道实际出现错误时,我不会收到电子邮件.

那么有没有办法让curl只在stderr上输出错误,但是在stdout上保持正常输出不变?

curl stdout stderr

25
推荐指数
3
解决办法
2万
查看次数

将Python'print'输出重定向到Logger

我有一个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指向文件(请参阅:重定向打印到日志文件)

python logging stdout

25
推荐指数
4
解决办法
4万
查看次数

"subprocess.Popen" - 检查成功和错误

我想检查子进程是否已成功执行或失败.目前我已经提出了一个解决方案,但我不确定它是否正确可靠.是否保证每个进程仅向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)

python subprocess stdout stderr python-3.x

25
推荐指数
2
解决办法
5万
查看次数

如何从QProcess获取STDOUT?

我以为我将使用以下代码从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)

我期待的是看到程序的输出打印到调试控制台,但我看到的只有:

完成!

我知道:

  • 程序启动正常,因为打印结束时的消息.
  • 该程序确实打印输出,因为在终端中运行完全相同的命令会产生一个长串的文本.

我在这做错了什么?

qt stdout process qprocess

24
推荐指数
2
解决办法
3万
查看次数

在运行时拦截子进程的stdout

如果这是我的子流程:

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)

为什么readlinecommunicate等待,直到程序完成后运行?有没有一种简单的方法来传递(和修改)子进程'stdout实时?

顺便说一下,我已经看过,但是我不需要记录功能(并且没有太多的了解它).

我在Windows XP上.

python subprocess stdout process popen

23
推荐指数
2
解决办法
2万
查看次数

如何从ALREADY正在运行的进程中捕获stdout

我有一个正在运行的cron工作,它将持续一段时间,我想查看它的stdout.我不知道这个过程是由cron启动的重要性,但我想我会提到它.这是在OSX上,所以,我无法访问像.../proc/[pid]/...,或truss,或strace这样的东西.使用IO重定向(例如script > output & tail -f output)执行的建议是不可接受的,因为此过程已经1)已经运行,并且2)无法通过重定向停止/重新启动.如果有一些通用解决方案适用于各种Unices,那将是理想的,但具体而言我现在正试图在Mac上实现这一点.

macos cron stdout process capture

23
推荐指数
3
解决办法
2万
查看次数

将文件用作stdin和stdout用于子进程

如何使用python子进程模块复制以下批处理命令?

myprogram < myinput.in > myoutput.out
Run Code Online (Sandbox Code Playgroud)

换句话说,如何myprogram使用myinput.in标准输入和myoutput.out标准输出的内容运行?

python stdin subprocess stdout

23
推荐指数
1
解决办法
2万
查看次数