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

War es hilfreich?

Lösung

  • Entfernen Sie den shell=True Teil. Shell hat nichts damit zu tun. Mit shell=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 .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top