python: lancer un processus avec temporisation et stdout de capture, stderr et état de sortie [en double]

StackOverflow https://stackoverflow.com/questions/1556348

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"
Était-ce utile?

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
scroll top