GVKun编程网logo

如何在Python中重定向stderr?(python stdout重定向)

8

这篇文章主要围绕如何在Python中重定向stderr?和pythonstdout重定向展开,旨在为您提供一份详细的参考资料。我们将全面介绍如何在Python中重定向stderr?的优缺点,解答pyt

这篇文章主要围绕如何在Python中重定向stderr?python stdout重定向展开,旨在为您提供一份详细的参考资料。我们将全面介绍如何在Python中重定向stderr?的优缺点,解答python stdout重定向的相关问题,同时也会为您带来bash – 如何将错误输出重定向到stdout和stderr?、bash:如何重定向stdin / stderr然后再恢复fd?、linux g编译器重定向stderr和stdout创建空文件、linux – 从后台进程重定向stdout和stderr的实用方法。

本文目录一览:

如何在Python中重定向stderr?(python stdout重定向)

如何在Python中重定向stderr?(python stdout重定向)

我想记录Python脚本的所有输出。我试过了:

import syslog = []class writer(object):    def write(self, data):        log.append(data)sys.stdout = writer()sys.stderr = writer()

现在,如果我“打印’某物’”,它将被记录下来。但是,如果我出现一些语法错误,例如说“ print’something#”,它将不会被记录-它会进入控制台。

如何从Python解释器中捕获错误?

我在这里看到了可能的解决方案:

http://www.velocityreviews.com/forums/showpost.php?p=1868822&postcount=3

但是第二个示例登录到/ dev / null-这不是我想要的。我想将其登录到类似上面的示例或StringIO之类的列表中。

另外,最好不要创建子进程(并在单独的线程中读取其stdout和stderr)。

答案1

小编典典

在Python代码中,您无法做任何事情来捕获相同代码的编译过程中的错误。怎么可能
如果编译器无法完成代码的编译,它将无法运行该代码,因此您的重定向甚至尚未生效。

这就是您(不需要的)子进程的所在。您可以编写重定向标准输出的Python代码,然后调用Python解释器来编译其他代码。

bash – 如何将错误输出重定向到stdout和stderr?

bash – 如何将错误输出重定向到stdout和stderr?

我正在组建一个复杂的管道,我想在程序输出中包含stderr以便记录,但我也希望错误保留在stderr上,这样我就能发现问题.

我发现this question询问如何将stdout stderr指向一个文件并仍在终端上获得stderr;它很接近,但我不想将stdout重定向到一个文件:程序的输出将被其他脚本使用,所以我希望它保留在stdout上(对于stderr也是如此).所以,总结一下:

>脚本在fd 1中生成输出,在fd 2中生成错误.
>我希望调用程序重新排列事物,以便输出错误出现在fd 1中,错误出现在fd 2中.
>此外,错误应与输出交错(尽可能与自己的缓冲允许),最后不保存和添加.

尽职调查:使用2>& 1捕获stderr非常容易.通过T形管道保存和查看标准输出很容易.我也知道如何将stdout转移到文件并通过管道直接stderr:命令2>& 1 1> fileA |发球文件B.但是我如何复制stderr并将stdout放回fd 1?

作为生成stdout和stderr的测试,让我们使用以下内容:
{ echo out; echo err >&2; }

以下代码演示了如何将stdout和stderr发送到管道中的下一步,同时还将stderr发送到终端:

${ echo out; echo err >&2; } 2> >(tee /dev/stderr) | cat >f
err
$cat f
out
err

这个怎么运作

> 2>

这会将stderr重定向到后面的(伪)文件.
>>(tee / dev / stderr)

这是进程替换,它充当从stderr接收输入的伪文件.它接收的任何输入都被发送到tee命令,该命令将它发送到stderr和stdout.

bash:如何重定向stdin / stderr然后再恢复fd?

bash:如何重定向stdin / stderr然后再恢复fd?

我想要一个脚本将stdin和stderr重定向到一个文件,做一堆东西,然后撤消那些重定向并对文件内容采取行动.我尝试着:
function redirect(){
   exec 3>&1
   exec 4>&2
   exec 1>outfile 2>&1
}
function undirect(){
   exec 1>&3
   exec 2>&4
}
echo first
redirect
echo something
cat kjkk
undirect
if some_predicate outfile; then echo ERROR; fi

这似乎做我想要的,但似乎相当复杂.是否有更清洁/更清晰的方法来做到这一点?

如果你真的需要来回切换它,而不事先知道将会在何时何地发生,这几乎就是这样做的.根据您的要求,尽管隔离需要重定向的部件并将其作为组执行可能更为简洁,如下所示:
echo first
{
  echo something
  cat kjkk
} 1>outfile 2>&1
if some_predicate outfile; then echo ERROR; fi

{}称为组命令,重定向整个组的输出.如果您愿意,可以在子shell中执行您的执行,因为它只会影响子shell.

echo first
(
  exec 1>outfile 2>&1

  echo something
  cat kjkk
)
if some_predicate outfile; then echo ERROR; fi

请注意,我在这里使用括号()而不是大括号{}(在第一个示例中使用).

HTH

linux g编译器重定向stderr和stdout创建空文件

linux g编译器重定向stderr和stdout创建空文件

我将g编译器输出(stderr和stdout)重定向到 linux上的文件.但它正在创建一个空文件.

我在其他帖子中读到stdout在每一行之后都没有刷新.好的,但是stderr呢.在我的情况下,有几个屏幕运行编译错误.所以,我对stderr输出感兴趣.没有创建stdout输出.

g++ -c -I ~/cplusplus/boost_1_37_0/boost_1_37_0/ -I 
~/cplusplus/niVxWorksDeliver/TEES/ Algorithms.cpp 2> output

上面的命令创建一个名为“output”的空文件.以下命令报告无效的null命令.

g++ -c -I ~/cplusplus/boost_1_37_0/boost_1_37_0/ -I    
~/cplusplus/niVxWorksDeliver/TEES/ Algorithms.cpp &> output
Invalid null command.

解决方法

你的一条评论背叛了你没有使用bash.你正在使用csh或tcsh.在这种情况下,您可以重定向所有输出(包括标准错误),如下所示:

g++ -c Algorithms.cpp >& output

有关更多csh重定向语法,我有a useful link个书签.请注意,csh重定向语法不像bash语法那样流畅.你可以在bash中做更多的事情.

linux – 从后台进程重定向stdout和stderr

linux – 从后台进程重定向stdout和stderr

我有一个名为foo的脚本,它运行程序a.exe并将计时统计信息发送到文件time.log

#!/bin/bash
date 1>> time.log
(time ./a.exe) 2>> time.log

如果我在终端的后台运行脚本并保持shell打开直到a.exe完成,但是如果我在后台运行脚本并退出终端(a.exe需要很长时间才能运行)

foo & 
exit

当我回来时,a.exe已经执行但时间统计信息没有出现在我的日志文件中.有人知道为什么吗?在我关闭父shell之后有没有办法获取时序统计信息?

谢谢

解决方法

nohup foo &

当你退出shell时,它会向所有子进程发送一个SIGHUP信号,默认情况下会杀死它们.如果您希望进程在父shell退出时继续执行,那么您需要让它忽略SIGHUP.

NAME

nohup — invoke a command immune to hangups

SYnopSIS

06001

DESCRIPTION

The nohup utility invokes command with its arguments and at this time sets the signal SIGHUP to be ignored. If the standard output is a terminal,the standard output is appended to the file nohup.out in the current directory. If standard error is a terminal,it is directed to the same place as the standard output.

今天关于如何在Python中重定向stderr?python stdout重定向的分享就到这里,希望大家有所收获,若想了解更多关于bash – 如何将错误输出重定向到stdout和stderr?、bash:如何重定向stdin / stderr然后再恢复fd?、linux g编译器重定向stderr和stdout创建空文件、linux – 从后台进程重定向stdout和stderr等相关知识,可以在本站进行查询。

本文标签: