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

Python 什么';处理输出重定向的最佳方法是什么?,python,redirect,Python,Redirect,我希望我的程序默认为标准输出,但可以选择将其写入文件。我应该创建自己的打印函数并调用该函数来测试是否有输出文件,还是有更好的方法?这对我来说似乎效率低下,但我能想到的每一种调用方法都是对每个打印调用进行额外的if测试。我知道,从长远来看,这真的不重要,至少在这个脚本中是这样,但我只是在努力学习好习惯。只需使用打印将内容写入标准输出即可。如果用户希望将输出重定向到文件,则可以执行以下操作: python foo.py > output.txt 只需使用打印将其写入标准输出即可。如果用户希望

我希望我的程序默认为标准输出,但可以选择将其写入文件。我应该创建自己的打印函数并调用该函数来测试是否有输出文件,还是有更好的方法?这对我来说似乎效率低下,但我能想到的每一种调用方法都是对每个打印调用进行额外的if测试。我知道,从长远来看,这真的不重要,至少在这个脚本中是这样,但我只是在努力学习好习惯。

只需使用打印将内容写入标准输出即可。如果用户希望将输出重定向到文件,则可以执行以下操作:

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,这似乎是一个非常优雅的解决方案。