Python 什么';处理输出重定向的最佳方法是什么?
我希望我的程序默认为标准输出,但可以选择将其写入文件。我应该创建自己的打印函数并调用该函数来测试是否有输出文件,还是有更好的方法?这对我来说似乎效率低下,但我能想到的每一种调用方法都是对每个打印调用进行额外的if测试。我知道,从长远来看,这真的不重要,至少在这个脚本中是这样,但我只是在努力学习好习惯。只需使用打印将内容写入标准输出即可。如果用户希望将输出重定向到文件,则可以执行以下操作:Python 什么';处理输出重定向的最佳方法是什么?,python,redirect,Python,Redirect,我希望我的程序默认为标准输出,但可以选择将其写入文件。我应该创建自己的打印函数并调用该函数来测试是否有输出文件,还是有更好的方法?这对我来说似乎效率低下,但我能想到的每一种调用方法都是对每个打印调用进行额外的if测试。我知道,从长远来看,这真的不重要,至少在这个脚本中是这样,但我只是在努力学习好习惯。只需使用打印将内容写入标准输出即可。如果用户希望将输出重定向到文件,则可以执行以下操作: python foo.py > output.txt 只需使用打印将其写入标准输出即可。如果用户希望
python foo.py > output.txt
只需使用打印将其写入标准输出即可。如果用户希望将输出重定向到文件,则可以执行以下操作:
python foo.py > output.txt
我的反应是输出一个临时文件,然后将其转储到stdio,或者将其移动到他们请求的地方 我的反应是输出一个临时文件,然后将其转储到stdio,或者将其移动到他们请求的地方 我建议您使用日志模块和日志处理程序。。。流、输出文件等…我建议您使用日志模块和日志处理程序。。。流、输出文件等。如果使用子流程模块,则根据从命令行获取的选项,可以将stdout选项用于打开的文件对象。这样,您就可以从程序内部重定向到文件
import subprocess
with open('somefile','w') as f:
proc = subprocess.Popen(['myprog'],stdout=f,stderr=subprocess.PIPE)
out,err = proc.communicate()
print 'output redirected to somefile'
如果您使用子流程模块,那么根据从命令行获取的选项,可以将stdout选项用于打开的文件对象。这样,您就可以从程序内部重定向到文件
import subprocess
with open('somefile','w') as f:
proc = subprocess.Popen(['myprog'],stdout=f,stderr=subprocess.PIPE)
out,err = proc.communicate()
print 'output redirected to somefile'
写入文件对象,当程序启动时,将该对象指向sys.stdout或用户指定的文件
Mark Byers的回答更像unix,其中大多数命令行工具只使用stdin和stdout,让用户根据自己的需要进行重定向。写入文件对象,程序启动时,让该对象指向sys.stdout或用户指定的文件
Mark Byers的回答更像unix,其中大多数命令行工具只使用stdin和stdout,让用户根据自己的需要进行重定向。不,您不需要创建单独的打印功能。在Python 2.6中,有以下语法:
# suppose f is an open file
print >> f, "hello"
# now sys.stdout is file too
print >> sys.stdout, "hello"
在Python 3.x中:
print("hello", file=f)
# or
print("hello", file=sys.stdout)
所以你真的不必区分文件和标准输出。它们是一样的
一个玩具示例,以您想要的方式输出“hello”:
#!/usr/bin/env python3
import sys
def produce_output(fobj):
print("hello", file=fobj)
# this can also be
# fobj.write("hello\n")
if __name__=="__main__":
if len(sys.argv) > 2:
print("Too many arguments", file=sys.stderr)
exit(1)
f = open(argv[1], "a") if len(argv)==2 else sys.stdout
produce_output(f)
请注意,打印过程是抽象的,它是使用标准输出还是使用文件。否,您不需要创建单独的打印功能。在Python 2.6中,有以下语法:
# suppose f is an open file
print >> f, "hello"
# now sys.stdout is file too
print >> sys.stdout, "hello"
在Python 3.x中:
print("hello", file=f)
# or
print("hello", file=sys.stdout)
所以你真的不必区分文件和标准输出。它们是一样的
一个玩具示例,以您想要的方式输出“hello”:
#!/usr/bin/env python3
import sys
def produce_output(fobj):
print("hello", file=fobj)
# this can also be
# fobj.write("hello\n")
if __name__=="__main__":
if len(sys.argv) > 2:
print("Too many arguments", file=sys.stderr)
exit(1)
f = open(argv[1], "a") if len(argv)==2 else sys.stdout
produce_output(f)
请注意,打印过程是抽象的,它是使用标准输出还是使用文件。很好,我没有想到这一点。但是,对于这种特殊情况,我仍然不能这样做,因为我还将状态消息打印到stdout,我不想将其放入文件中。@kryptobs2000:您知道stderr用于状态和错误消息,是吗?向sys.stdout发送状态消息有什么意义?很好,我没有想到这一点。但是,对于这种特殊情况,我仍然不能这样做,因为我还将状态消息打印到stdout,我不想将其放入文件中。@kryptobs2000:您知道stderr用于状态和错误消息,是吗?向sys.stdout发送状态消息有什么意义?谢谢,这可能是我要做的。谢谢,这可能是我要做的。哇,谢谢,我很惊讶我不知道。我正在使用Python3,这似乎是一个非常优雅的解决方案。哇,谢谢,我很惊讶我不知道这一点。我正在使用Python3,这似乎是一个非常优雅的解决方案。