2016-06-20 8 views
0

Ich führe einen Bash-Befehl (der eine Datei herunterlädt) in einem Python-Skript.Async Python Funktionsaufruf auf eine Bash-Ausführung (über Python Popen)

def execBashCmd(bash_cmd): 
    process = Popen([bash_cmd], stdout=PIPE, stderr=PIPE, shell=True) 

Die bash Befehl gibt eine Progression (aktualisiert) in stdout wie folgt:

Downloading File - 20.66 MiB/165.31 MiB 

Ich möchte die Progression zu aktualisieren, um der Lage sein, eine Python-Funktion in einem regelmäßigen Intervall zu nennen (die ich würde mit einer Regex oder so etwas fangen) irgendwo in meinem Python-Code.

cmd = "gsutil cp -n ...."  # A Bash command downloading a file and displaying a status in stdout while busy. 
code = utils.execBashCmd(cmd) 
self.setProgress(BASH_CURRENT_PROGRESS) # This line should be asynchrone and called upon the bash command lifetime 

Gibt es einen Weg, dies zu erreichen?

+0

Diese Frage ist neu und scheint ähnlich wie Ihre eigene Frage: http://stackoverflow.com/questions/37925840/python-monitoring-progress-of-handbrake - es gibt einen grundlegenden Mechanismus ist es, dass könnte oder auch nicht arbeite in deinem Fall. – advance512

Antwort

0

Ich mag wäre in der Lage sein, eine Python-Funktion in einem regelmäßigen Intervall ruft die Progression zu aktualisieren irgendwo in meinem Python-Code (die ich mit einem regex oder so etwas wie diesem fangen würde).

Zu jeder Zeit können Sie e anrufen. G. os.read(process.stdout.fileno(), 4096) und holen Sie sich zu diesem Zeitpunkt die Ausgabefortschritt des Bash-Befehls (möglicherweise mehrere Updates), vorausgesetzt, die Anzahl der Bytes ist groß genug. Wenn Sie bis zum nächsten Fortschritt Ausgang blockieren nicht dieser Aufruf wollen, wenn es noch nicht ist, können Sie das Rohr nicht blockiert machen mit

fcntl.fcntl(process.stdout, fcntl.F_SETFL, os.O_NONBLOCK) 

und e tun. G.

try: 
    progress = os.read(process.stdout.fileno(), 4096) 
except OSError: 
    # no progress data 
    pass 
Verwandte Themen