Um die Ausgabe in eine Datei und ein Terminal umzuleiten, ohne die Verwendung Ihres Python-Skripts im Freien zu ändern, können Sie Folgendes verwenden 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)
Wenn das ptyModul nicht verfügbar ist (unter Windows), können Sie es durch eine portablere teed_call()Funktion ersetzen , die jedoch normale Pipes anstelle eines Pseudo-Terminals bereitstellt. Dies kann das Verhalten einiger Programme ändern.
Der Vorteil von pty.spawnund subprocess.Popen-basierten Lösungen gegenüber dem Ersetzen sys.stdoutdurch ein dateiähnliches Objekt besteht darin, dass sie die Ausgabe auf Dateideskriptorebene erfassen können, z. B. wenn das Skript andere Prozesse startet, die auch eine Ausgabe auf stdout / stderr erzeugen können. Siehe meine Antwort auf die verwandte Frage: Stdout in eine Datei in Python umleiten?