Kaj G. schrieb:
> Statt call Popen nutzen.
>
1 | > from subprocess import Popen, PIPE
|
2 | >
|
3 | > proc = Popen(['./clock.py',], stdout=PIPE, stderr=PIPE)
|
4 | > out, err = proc.communicate()
|
5 | >
|
Nicht als Kritik, sondern nur als Hinweis gedacht:
Direkt nach dem Instanziieren eines subprocess.Popen-Objekts darauf die
Methode communicate() aufzurufen, ist irgendwie widersinnig.
communicate() blockt nämlich: "Interact with process: Send data to
stdin. Read data from stdout and stderr, until end-of-file is reached.
Wait for process to terminate." [1]
Aber wenn ich gleich nach dem Starten des Subprozesses ohnehin blocke,
bis der Subprozess beendet ist, kann ich mich gleich an die erste
Empfehlung halten: "The recommended approach to invoking subprocesses is
to use the run() function for all use cases it can handle. For more
advanced use cases, the underlying Popen interface can be used
directly." [2]
Kurz gesagt: Einen Unterprozeß zu starten, sein Ende abzuwarten, seinen
Rückgabewert zu checken, und am Ende stdout und / oder stderr
auszulesen, ist kein "advanced use case" und braucht kein Popen. Dafür
reicht bereits die Funktion subprocess.run() vollkommen aus. Sie gibt
eine Instanz von subprocess.CompletedProcess zurück, aus deren Membern
returncode, stdout, und stderr die gewünschten Informationen bezogen
werden können.
Ein Anwendungsfall für subprocess.Popen ist zum Beispiel, wenn man mit
dem Subprozess tatsächlich interagieren will, also die Ausgaben auf
stdout und / oder stderr schon während der Laufzeit des Prozesses
mitlesen und darauf reagieren möchte, etwa indem man etwas an stdin oder
ein Signal schickt.
Nichtsdestotrotz erscheint es natürlich etwas merkwürdig, was der TO
hier macht, denn die Rückgabe der aktuellen Uhrzeit in Minuten und
Sekunden als String geht ganz easy über
1 | import time
|
2 | time.strftime('%H:%M')
|
Mit dem Modul datetime kann dabei sogar hübsch herumgerechnet werden:
1 | import datetime
|
2 | uhrzeit_vor_drei_minuten = (
|
3 | datetime.datetime.now() - datetime.timedelta(minutes=3)
|
4 | ).strftime('%H:%M')
|
Ein Teufelszeug, dieses Python. ;-)
[1]
https://docs.python.org/3/library/subprocess.html#subprocess.Popen.communicate
[2] https://docs.python.org/3/library/subprocess.html#subprocess.run