Python子输出到subprocess中的控制台scricpt
在我的父母脚本中,我执行以下操作:
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");
但是这也行不通。 任何帮助将不胜感激!
如果stdout,stderr被redirect,那么你可以尝试直接打印到控制台:
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.py
,你可以拥有你自己的stdout
和stderr
实例。或者你也可以不把stdout / stdinredirect到1.py
,而是将fout/ferr
作为parameter passing给它。 就像是:
# 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