Щоб перенаправити вихід у файл і термінал, не змінюючи способу використання сценарію Python зовні, ви можете використовувати pty.spawn(itself):
"""Redirect stdout to a file and a terminal inside a script."""
import os
import pty
import sys
def main():
print('put your code here')
if __name__=="__main__":
sentinel_option = '--dont-spawn'
if sentinel_option not in sys.argv:
with open('script.log', 'wb') as log_file:
def read(fd):
data = os.read(fd, 1024)
log_file.write(data)
return data
argv = [sys.executable] + sys.argv + [sentinel_option]
rc = pty.spawn(argv, read)
else:
sys.argv.remove(sentinel_option)
rc = main()
sys.exit(rc)
Якщо ptyмодуль недоступний (у Windows), ви можете замінити його teed_call()функцією, яка є більш портативною, але він надає звичайні канали замість псевдотермінала - це може змінити поведінку деяких програм.
Перевага pty.spawnі subprocess.Popen-О рішення над заміною sys.stdoutз файл-подібний об'єкт , який вони можуть захопити вихід на дескриптор файлу рівень , наприклад, якщо скрипт запускає інші процеси , які також можуть виробляти висновок на стандартний висновок / STDERR. Дивіться мою відповідь на відповідне питання: Перенаправити stdout на файл у Python?