python: lancer un processus avec temporisation et stdout de capture, stderr et état de sortie [en double]
-
21-09-2019 - |
Question
Possible en double: subprocess avec délai d'attente
Quelle est la meilleure façon de faire ce qui suit en Python:
- Exécuter un processus externe
- stdout de capture dans une chaîne, stderr, et l'état de sortie
- Définissez un délai.
Je voudrais quelque chose comme ceci:
import proc
try:
status, stdout, stderr = proc.run(["ls", "-l"], timeout=10)
except proc.Timeout:
print "failed"
La solution
Je déteste faire le travail par moi-même. Il suffit de copier ceci dans votre module proc.py.
import subprocess
import time
import sys
class Timeout(Exception):
pass
def run(command, timeout=10):
proc = subprocess.Popen(command, bufsize=0, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
poll_seconds = .250
deadline = time.time()+timeout
while time.time() < deadline and proc.poll() == None:
time.sleep(poll_seconds)
if proc.poll() == None:
if float(sys.version[:3]) >= 2.6:
proc.terminate()
raise Timeout()
stdout, stderr = proc.communicate()
return stdout, stderr, proc.returncode
if __name__=="__main__":
print run(["ls", "-l"])
print run(["find", "/"], timeout=3) #should timeout
Autres conseils
Note sur linux avec coreutils> = 7.0 vous pouvez préfixer délai d'attente à la commande comme:
timeout 1 sleep 1000
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow