Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python将stdout和stderr重定向到同一个文件_Python_Python 2.7_Stderr - Fatal编程技术网

使用Python将stdout和stderr重定向到同一个文件

使用Python将stdout和stderr重定向到同一个文件,python,python-2.7,stderr,Python,Python 2.7,Stderr,我想将Python脚本的标准错误和标准输出重定向到同一个输出文件。从我可以使用的终端 $ python myfile.py &> out.txt 完成我想要的相同任务,但我需要从Python脚本本身开始 我研究了这些问题,以及来自的示例10.10,然后尝试了以下方法: import sys fsock = open('out.txt', 'w') sys.stdout = sys.stderr = fsock print "a" import sys fsock = open

我想将Python脚本的标准错误和标准输出重定向到同一个输出文件。从我可以使用的终端

$ python myfile.py &> out.txt
完成我想要的相同任务,但我需要从Python脚本本身开始

我研究了这些问题,以及来自的示例10.10,然后尝试了以下方法:

import sys
fsock = open('out.txt', 'w')
sys.stdout = sys.stderr = fsock

print "a"
import sys
fsock = open('out.txt', 'w')
sys.stdout = sys.stderr = fsock

print "a   # missing end quote, will give error
正确地打印文件out.txt中的字母“a”;但是,当我尝试以下操作时:

import sys
fsock = open('out.txt', 'w')
sys.stdout = sys.stderr = fsock

print "a"
import sys
fsock = open('out.txt', 'w')
sys.stdout = sys.stderr = fsock

print "a   # missing end quote, will give error
我在终端上收到错误消息“SyntaxError…”,但不在out.txt文件中。我需要做什么才能将SyntaxError发送到out.txt文件?我不想编写异常,因为在这种情况下,我必须在脚本中编写太多的异常。我正在使用Python 2.7

更新:正如下面的答案和评论所指出的,SyntaxError将始终输出到屏幕,我替换了这一行

print "a   # missing end quote, will give error


ZeroDivisionError被输出到文件中,正如我在问题中所希望的那样。

在程序开始运行之前,Python文件中会出现类似上述的SyntaxError: Python文件的编译与任何其他编译语言一样——如果解析器或编译器在Python文件中找不到意义,则不会生成可执行字节码,因此程序不会运行

在代码中有目的地生成异常的正确方法——从像您这样的简单测试用例到实现复杂的流控制模式,都是使用Pyton命令
raise

只需将您的打印留在那里,并在末尾添加一行如下内容:

raise Exception
然后你会发现你的伎俩会奏效

您的程序在运行时可能会以许多其他方式失败,而无需进行明确的提升,例如,如果您强制除法0,或者只是尝试使用未赋值(因此为“未声明”)变量,但故意的语法错误将产生程序从一开始就无法运行的效果,即使是前几行也是如此。

sys.stdout = open('out.log', 'w')
sys.stderr = sys.stdout

尝试在代码中引发一个不是语法错误的错误。在
print“a”
之后,提出一个错误,比如
raisevalueerror(“发生了一件非常具体的坏事”)
@JamesRusso,出于我在问题中提到的原因,我不想提出任何类型的异常。有没有一种方法可以从Python脚本本身内部模拟bash的“&>filename”方式?我指的只是为了测试目的。。。为了测试它是否工作,只需提出一个错误,并确保它正在写入您的文件。如果是这样,所有未来的错误都应写入file@jsbueno,和James Russo,看起来问题出在SyntaxError上。可能其他异常会按照我的要求重定向到文件中。@jsbueno这在Python 3.6中不起作用吗?我正在使用类似的代码,但文本文件中没有打印任何内容。我在脚本末尾添加了行raise异常,但仍然会输出到屏幕。我看到SyntaxError的问题。在我的实际脚本中,问题很可能不是语法错误,而是数字错误。但是,无论如何,我想把错误发送到一个文件中。好吧,我刚刚使用了你的确切模式,它对我很有效。当然,如果它是一个未捕获的异常,将在字符串上打印内容,这也意味着程序将在该点终止。但是异常回溯到一个文件。我确认它有效。我用一个零除法进行了尝试,得到了回溯和“零除法错误:零除法”在同一个日志文件中,而不是在同一时间打开标准输出。我正在使用Python 3.7.1