Python从子脚本输出到Subprocess中的Console

时间:2014-01-07 20:13:47

标签: python bash python-3.x subprocess

在我的父脚本中,我执行以下操作:

fout=open(outfile,"w")
ferr = open(errfile,"w")

subprocess.call("1.py",stdout=fout,stderr=ferr,shell=True)

1.py脚本中,我希望大部分日志消息都转到日志文件,但是我想根据打印条件在控制台上打印一些消息:

print "Hello World"

但它正在打印到outfile,我想在控制台上打印,我尝试了

sys.__stdout__.write("Hello World");

但是,这也不起作用。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:2)

如果stdout,stderr被重定向,那么你可以尝试直接打印到控制台:

try: # Windows
    from msvcrt import putwch

    def print_to_console(message):
        for c in message:
            putwch(c)
        # newline
        putwch('\r') 
        putwch('\n')
except ImportError: # Unix
    import os

    fd = os.open('/dev/tty', os.O_WRONLY | os.O_NOCTTY)
    tty = os.fdopen(fd, 'w', 1)
    del fd
    def print_to_console(message, *, _file=tty):
        print(message, file=_file)
    del tty

示例:

print_to_console("Hello TTY!")
# -> Hello TTY!

答案 1 :(得分:0)

如果您掌控1.py中的内容,则可以拥有自己的stdoutstderr实例 或者,也可以不将stdout / stdin重定向到1.py,而是将fout/ferr作为参数传递给它。类似的东西:

# assuming python 2.7.x
from __future__ import print_function
import argparse
import sys

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument('--stdout'
                       , nargs='?'
                       , type=argparse.FileType('a')
                       , default=sys.stdout)
    parser.add_argument( '--stderr'
                       , nargs='?'
                       , type=argparse.FileType('a')
                       , default=sys.stderr)

    namespace = parser.parse_args()

    print("Hello There", file=namespace.stdout)
    print("Error time", file=namespace.stderr)
    print("Always to stdout")
    print("Always to stderr", file=sys.stderr)

然后像这样运行它:

python 1.py --stdout=outfile.log stderr=errfile.log

subprocess拨打电话:

subprocess.call("1.py",shell=True) # no need to redirect stdout and stderr now