Вы можете перенаправить в файл, если вы просто хотите вывод в файл для последующей оценки.
Вы уже определили stdout / stderr процессов, которые вы выполняете методами stdout = / stderr =.
В вашем примере кода вы просто перенаправляете в скрипты текущие назначения out / err.
subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
sys.stdout и sys.stderr - это просто файловые объекты.
Как указано в документации по sys.stdout , «любой объект приемлем, если у него есть метод write (), который принимает строковый аргумент."
f = open('cmd_fileoutput.txt', 'w')
subprocess.Popen(cmd, shell=True, stdout=f, stderr=f)
Так что вам нужно предоставить ему класс с методом записи, чтобы перенаправить вывод.
Если вы хотите, чтобы как вывод на консоль, так и вывод на файл могли создавать класс для управления выводом.
Общее перенаправление:
# Redirecting stdout and stderr to a file
f = open('log.txt', 'w')
sys.stdout = f
sys.stderr = f
Создание класса перенаправления:
# redirecting to both
class OutputManager:
def __init__(self, filename, console):
self.f = open(filename, 'w')
self.con = console
def write(self, data):
self.con.write(data)
self.f.write(data)
new_stdout = OutputManager("log.txt", sys.stdout)
Чередование зависит от буферизации, поэтому вы можете получить или не получить ожидаемый результат.
(Возможно, вы можете отключить или уменьшить используемую буферизацию, но я не помню, как сейчас)