Heim > Backend-Entwicklung > Python-Tutorial > Wie kann ich Timeouts implementieren, wenn ich das „subprocess'-Modul von Python verwende?

Wie kann ich Timeouts implementieren, wenn ich das „subprocess'-Modul von Python verwende?

Linda Hamilton
Freigeben: 2024-12-17 17:57:11
Original
330 Leute haben es durchsucht

How Can I Implement Timeouts When Using Python's `subprocess` Module?

Pythons Unterprozessmodul und Timeouts

Das Unterprozessmodul bietet eine bequeme Möglichkeit, externe Befehle auszuführen, ihre Ausgaben zu erfassen und ihre Lebenszyklen zu verwalten. Standardmäßig unterstützt die Methode „communic()“ jedoch keine Zeitüberschreitungen. Dies stellt eine Herausforderung dar, wenn Befehle mit langer Laufzeit ausgeführt werden, die möglicherweise den aufrufenden Prozess blockieren könnten.

Timeouts mit check_output implementieren

Python 3.3 und höher stellt check_output() als bereit effizientere Alternative zu Popen() und communications(). Diese Funktion wertet einen Befehl aus, führt seine stdout- und stderr-Ausgaben in einer Bytezeichenfolge zusammen und löst einen CalledProcessError aus, wenn der Befehl mit einem Status ungleich Null beendet wird. Entscheidend ist, dass es auch Timeouts unterstützt, sodass Sie eine maximale Ausführungszeit für den Befehl angeben können.

from subprocess import STDOUT, check_output

seconds = 10  # Timeout in seconds
output = check_output(cmd, stderr=STDOUT, timeout=seconds)
Nach dem Login kopieren

In diesem Beispiel führt die Funktion check_output() den in cmd angegebenen Befehl aus und wartet, bis er abgeschlossen ist innerhalb von 10 Sekunden. Wenn der Befehl länger als 10 Sekunden dauert, wird ein TimeoutExpired-Fehler ausgelöst.

Verwendung von subprocess32 für Timeouts in Python 2.x

Für Python 2.x gilt: subprocess32 backport bietet die gleiche Timeout-Funktionalität wie check_output() in Python 3.3. Um subprocess32 zu installieren, verwenden Sie pip:

pip install subprocess32
Nach dem Login kopieren

Nach der Installation können Sie die call()-Funktion von subprocess32 verwenden, um Befehle mit Zeitüberschreitungen auszuführen:

import subprocess32

seconds = 10  # Timeout in seconds
subprocess32.call(cmd, timeout=seconds)
Nach dem Login kopieren

Zusätzliche Überlegungen

  • Entfernen Sie „shell=True“ nach Möglichkeit aus Ihren Unterprozessaufrufen. Dadurch werden Sicherheit und Leistung verbessert.
  • Das Timeout-Verhalten kann je nach Plattform und Prozesskomplexität variieren. Weitere Einzelheiten finden Sie in der Dokumentation zum Subprozess-Timeout-Fehler.

Das obige ist der detaillierte Inhalt vonWie kann ich Timeouts implementieren, wenn ich das „subprocess'-Modul von Python verwende?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage