在我的父脚本中,我执行以下操作:
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");
但是,这也不起作用。任何帮助将不胜感激!
答案 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
中的内容,则可以拥有自己的stdout
和stderr
实例
或者,也可以不将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