当前位置: 首页 > 面试题库 >

将子流程stderr重定向到stdout

张嘉佑
2023-03-14
问题内容

我想将子进程的stderr输出重定向到stdout。常量STDOUT应该这样做,不是吗?

然而,

$ python >/dev/null -c 'import subprocess;\
                        subprocess.call(["ls", "/404"],stderr=subprocess.STDOUT)'

确实 输出了一些东西。为什么会这样,如何在stdout上得到错误消息?


问题答案:

仔细阅读源代码即可得出答案。特别是,该文档在显示以下内容时会产生误导:

subprocess.STDOUT
表示(…)的特殊值表示标准错误应与标准输出进入同一 句柄

由于-1stderr=subprocess.STDOUT求值时stdout设置为“默认”(技术上来说),因此stderr也设置为“默认”。不幸的是,这意味着stderr输出仍然归stderr。

要解决此问题,请传入stdout文件而不是subprocess.STDOUT

$ python >/dev/null -c 'import subprocess,sys;subprocess.call(["ls", "/404"],
                        stderr=sys.stdout.buffer)'

或者,为了与旧版2.x Python版本兼容:

$ python >/dev/null -c 'import subprocess,sys;subprocess.call(["ls", "/404"],
                        stderr=sys.stdout.fileno())'


 类似资料:
  • 问题内容: 我在cyberciti.biz的评论中看到了这个有趣的问题。 我发现我什至找不到在sh的单行命令中执行此操作的灵活方法。 到目前为止,我对解决方案的想法是: 但是您会看到,这不是同步的,而且致命的是,它是如此丑陋。 欢迎与您分享这个想法。:) 问题答案: 你要 这里的顺序很重要。假设stdin(fd 0),stdout(fd 1)和stderr(fd 2)最初都连接到tty,因此 首先

  • 我想将stdout和stderr重定向到一个文件,同时保留输出顺序,然后还将stderr显示到屏幕上。我看到很多问题讨论它: https://unix.stackexchange.com/questions/9646/show-only-stderr-on-screen-but-write-both-stdout-and-stderr-to-file https://unix.stackexcha

  • 我有一个调用函数的PowerShell脚本。我正在努力实现所有这些,但不确定如何实现: 将标准输出写入控制台并输出。txt 将STDERR写入控制台并输出。txt和err。txt 确保所有STDOUT和STDERR输出仍按其生成的顺序 这就是我到目前为止所拥有的将STDOUT和STDERR写入文件的功能,但它不能完成我需要的其余部分。

  • 很好的一天。我有一系列的命令,我想通过一个函数来执行,这样我就可以得到退出代码并相应地执行控制台输出。话虽如此,我这里有两个问题: 1) 我似乎无法将stderr指向/dev/null。 2) 在执行$1之前,不会显示第一条回显行。直到我运行需要一段时间才能处理的命令,比如在硬盘上搜索文件,我才真正注意到这一点。此外,情况显然是这样,因为输出如下所示: 换句话说,stderr显示在“尝试…$2”之

  • 在 Linux 中,一切都只是文件。这意味着,对于控制台程序: 键盘表示为一个文件,Bash 从中读取你的输入。 显示器表示为一个文件,Bash向输出写入它。 让我们假设,你有一个程序可以计算文件中的行。你可以通过键入wc -l来调用它。现在尝试一下 没有发生什么事吧?它只是卡在那里。错了,它正在等待你的输入。这是它的工作原理: line_counter = 0 while end of file

  • 我有一个域有3个子域: 在我的nginx上有以下3个配置: API null