Spawn subprocess die Eingabekonsole, ohne zu blockieren erwartet?
-
21-08-2019 - |
Frage
Ich versuche, durch den Aufruf des cvs.exe Prozesses eine CVS-Login von Python zu tun. Wenn cvs.exe von Hand aufrufen, druckt er eine Nachricht an die Konsole und wartet dann auf den Benutzer zur Eingabe des Passworts.
Wenn es mit subprocess.Popen Aufruf habe ich, dass der Anruf blockiert bemerkt. Der Code ist
subprocess.Popen(cvscmd, shell = True, stdin = subprocess.PIPE, stdout = subprocess.PIPE,
stderr = subprocess.PIPE)
Ich gehe davon aus, dass es blockiert, weil es für die Eingabe wartet, aber meine Erwartung war, dass Popen Aufruf sofort zurückkehren würde und dann konnte ich subprocess.communicate () zur Eingabe des eigentlichen Passwort nennen. Wie kann ich dieses Verhalten erreichen und vermeiden auf Popen blockiert?
Betriebssystem: Windows XP
Python: 2.6
cvs.exe: 1,11
Lösung
- Entfernen Sie den
shell=True
Teil. Shell hat nichts damit zu tun. Mitshell=True
ist eine häufige Ursache für Probleme. - eine Liste von Parametern für cmd verwenden.
Beispiel:
cmd = ['cvs',
'-d:pserver:anonymous@bayonne.cvs.sourceforge.net:/cvsroot/bayonne',
'login']
p = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
Dies wird nicht blockieren auf meinem System (mein Skript weiter ausgeführt wird). Da jedoch cvs das Passwort direkt vom Terminal (nicht von der Standardeingabe oder Ausgabe) liest Sie nicht schreiben Sie einfach das Passwort an der subprocess' stdin.
Was Sie tun können, ist das Passwort als Teil der CVSROOT Spezifikation passieren stattdessen wie folgt aus:
:pserver:<user>[:<passwd>]@<server>:/<path>
d. eine Funktion zu einem Source Projekt anmelden:
import subprocess
def login_to_sourceforge_cvs(project, username='anonymous', password=''):
host = '%s.cvs.sourceforge.net' % project
path = '/cvsroot/%s' % project
cmd = ['cvs',
'-d:pserver:%s:%s@%s:%s' % (username, password, host, path),
'login']
p = subprocess.Popen(cmd, stdin=subprocess.PIPE,
stdout=subprocess.PIPE
stderr=subprocess.STDOUT)
return p
Das funktioniert für mich. Der Aufruf
login_to_sourceforge_cvs('bayonne')
Wird anonym an die bayonne Projekts cvs log in.
Andere Tipps
Wenn Sie externe Programme automatisieren, die Eingabe benötigen - wie Passwort - Ihre beste Wette wäre wahrscheinlich zu benutzen pexpect .