【问题标题】:Redirecting subprocess.call output not working重定向 subprocess.call 输出不起作用
【发布时间】:2017-03-11 02:31:13
【问题描述】:

我正在尝试编写一个充当简单 UNIX bash 命令 shell 的 python 脚本。我需要阻止脚本的所有输出并将其重定向到两个文件之一(错误或输出)。不幸的是,在目录上运行我的 bash 命令时,我得到输出“grep: test_dir: Is a directory”。这是在将我的 sys.stdout 重定向到临时文件之后。我的理论是 grep 本身正在重置输出并打印此错误,而不是简单地返回输出。有没有办法可以将任何和所有输出重定向到文件?还是我只是误解了如何在 python 中重定向?

这是我当前的代码。

try:
    temp_out = sys.stdout
    sys.stdout = open('./temp.txt', 'w+')
    output = subprocess.call(['grep', search[0], search[1]])
    sys.stdout = temp_out
except subprocess.CalledProcessError as err:
    print output
    err_output = err.returncode
    print "In error"

【问题讨论】:

    标签: python shell unix redirect grep


    【解决方案1】:

    不要替换sys.stdout;打开一个普通文件并将其作为stdout 参数传递。

    with open('destination.txt', 'w') as redirected_output:
      p = subprocess.Popen(['ls', '-l'], stdout=redirected_output)
      p.communicate()
    

    刚刚为我工作。

    【讨论】:

    • 不幸的是,我需要将子进程本身发送的任何输出重定向到标准输出。这只会重定向我的程序已经执行的返回值。 ls 命令没有这个错误问题,或者至少没有那个特定的调用。
    【解决方案2】:

    来自 Python doc

    stdout用于print()和表达式语句的输出和input()的提示;

    我的猜测是它不适用于子进程。

    一种方法:

    p = subprocess.Popen(['grep', search[0], search[1]], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    out, err = p.communicate()
    sys.stdout.write(out) # you have to decode byte to str if it's Python3
    sys.stderr.write(err)
    

    【讨论】:

    • 这正是我所需要的!它将返回值和可能的错误分离到我可以操作的不同变量中。
    • @JacobChesley 其实如果你只想将子进程的输出和错误重定向到文件中,9000的解决方案更好。如果你想在你的程序中重定向包括print(...)在内的所有内容,我的更好。
    • 在这种情况下,我想重定向子进程的所有输出,包括打印。这样我就可以将所有输出操作为我需要的格式。在这种情况下,您的解决方案正是我正在寻找的,尽管 9000 是一个好主意,可以保留在引擎盖下以备将来努力。
    猜你喜欢
    • 2012-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多