处理输出重定向的最佳方法是什么?

时间:2011-02-12 23:51:44

标签: python redirect

我希望我的程序默认为stdout,但是可以选择将其写入文件。我应该创建自己的打印功能并将测试称为存在输出文件或者是否有更好的方法?这对我来说似乎效率低下,但我能想到的每一种方式都会为每次打印调用进行额外的测试。我知道从长远来看这无关紧要,至少在这个剧本中,但我只是想学习好习惯。

6 个答案:

答案 0 :(得分:4)

使用print写入标准输出。如果用户想要将输出重定向到文件,他们可以这样做:

python foo.py > output.txt

答案 1 :(得分:2)

写入文件对象,当程序启动时,该对象指向sys.stdout或用户指定的文件。

Mark Byers的回答更像unix,大多数命令行工具只使用stdin和stdout,让用户按照自己的意愿进行重定向。

答案 2 :(得分:1)

不,您不需要创建单独的打印功能。在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还是文件。

答案 3 :(得分:0)

我建议您使用日志记录模块和logging.handlers ...流,输出文件等。

答案 4 :(得分:0)

如果使用子进程模块,那么根据从命令行获取的选项,可以将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'

答案 5 :(得分:-1)

我的反应是输出到临时文件,然后将其转储到stdio,或者将其移动到他们请求的位置。