Pour rediriger la sortie vers un fichier et un terminal sans modifier la manière dont votre script Python est utilisé à l'extérieur, vous pourriez utiliser pty.spawn(itself)
:
#!/usr/bin/env python
"""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:
# run itself copying output to the log file
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)
Si pty
n'est pas disponible (sous Windows), alors vous pouvez le remplacer par teed_call()
fonction qui est plus portable mais qui fournit des pipes ordinaires au lieu d'un pseudo-terminal -- cela peut changer le comportement de certains programmes.
L'avantage de pty.spawn
y subprocess.Popen
-plutôt que de remplacer sys.stdout
avec un objet de type fichier est qu'ils peuvent capturer la sortie au niveau d'un descripteur de fichier, par exemple, si le script démarre d'autres processus qui peuvent également produire une sortie sur stdout/stderr. Voir ma réponse à la question connexe : Rediriger stdout vers un fichier en Python ?