2016-05-19 21 views
0

Wie verwende ich sh (Python-Modul) mit gevent?gevent + subprocess: Ist es möglich, Teilprozesse zu patchen, die in einigen importierten Modulen verwendet werden, zum Beispiel in sh?

Wenn ich suprocess direkt betreibe ich tun:

import gevent 
from gevent.subprocess import Popen, PIPE, STDOUT 
patch_all() 

subprocess.Popen(...) 

Aber wie ich sh mit gevent verwenden kann? Sprich:

from sh import tar 
tar("cf", "file.tar", "dir") 

tar ist nur ein Beispiel, ich möchte im Allgemeinen die Antwort zu finden. Ist das überhaupt möglich?

Wie patch ich Subprozess, der in sh verwendet wird?

Oder allgemeinere Frage:

Wie kann ich patchsubprocess wenn es in einigen der importierten Module verwendet wird (wie sh)? Ist es überhaupt möglich?

+0

Können Sie bitte mehr über Ihren Anwendungsfall sagen? Versuchen Sie, einfach asynchron auf mehrere Funktionen zu warten oder Daten zwischen ihnen zu teilen? – Charlie

+0

@Charlie: Ich teile Daten zwischen ihnen. Ich brauche keine Workarounds, ich habe viele Ideen, wie ich es ohne gevent + sh schreiben könnte, aber ich möchte wissen, wie ich es damit mache. Die Frage ist eigentlich allgemeiner: Wie patch ich Subprozess, wenn es in einigen externen Modulen (wie SH) verwendet wird? –

Antwort

2

Das sh Modul verwendet nicht das Subprozessmodul. Es macht einfach und direkt eine os.fork gefolgt von einer os.execve. Es verwaltet auch eigene Pipes für die Eingabe und Ausgabe. Daher hat alles, was an dem Unterprozessmodul ausgeführt wird, keine Auswirkung auf sh.

Also die Antwort auf Ihre Frage ist, nein, patchen Subprozess und erwartet, dass es keine Auswirkungen auf sh ist nicht möglich.

+0

Ok, das ist ein guter Punkt. Aber die Frage bleibt: Wie kann ich os.fork im sh-Modul mit gevent.fork ersetzen/patchen? –

+1

Wenn Sie bereits 'gevent.money.patch_all' verwenden, wird dies bereits durchgeführt. * Aber es ist fast egal! * Da 'sh'' os.execve' unmittelbar nach dem fork verwendet, ist das meiste, was der Patch tut, nicht notwendig. (Die Ausnahme ist, wenn Sie bereits libev Kinderbeobachter verwenden und auf diese neuen Kinder warten müssen. Dies gilt nur für gevent 1.1) –