Question

Je suis en train de faire une connexion CVS de Python en appelant le processus de cvs.exe. Lors de l'appel cvs.exe à la main, il imprime un message à la console, puis attend que l'utilisateur d'entrer le mot de passe.

Lors de l'appel avec subprocess.Popen, je l'ai remarqué que les blocs d'appel. Le code est

subprocess.Popen(cvscmd, shell = True, stdin = subprocess.PIPE, stdout = subprocess.PIPE,
    stderr = subprocess.PIPE)

Je suppose qu'il bloque parce qu'il est en attente pour l'entrée, mais mon attente était que l'appel Popen retournerait immédiatement et je pourrais appeler subprocess.communicate () pour saisir le mot de passe réel. Comment puis-je obtenir ce comportement et éviter le blocage sur Popen?

OS: Windows XP
Python: 2.6
cvs.exe: 1,11

Était-ce utile?

La solution

  • Retirez la partie shell=True. Votre coquille n'a rien à voir avec elle. L'utilisation est une cause <=> commune des problèmes.
  • Utilisez une liste de paramètres pour cmd.

Exemple:

cmd = ['cvs', 
       '-d:pserver:anonymous@bayonne.cvs.sourceforge.net:/cvsroot/bayonne', 
       'login']
p = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE) 

Cela ne bloque pas sur mon système (continue d'exécuter mon script). Toutefois, depuis cvs lit le mot de passe directement depuis le terminal (pas d'entrée standard ou la sortie) vous ne peut pas il suffit d'écrire le mot de passe à la sous-processus stdin.

Ce que vous pouvez faire est de passer le mot de passe dans le cadre de la spécification CVSROOT au lieu, comme ceci:

:pserver:<user>[:<passwd>]@<server>:/<path>

i.e.. une fonction pour se connecter à un projet SourceForge:

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

Cela fonctionne pour moi. Appel

login_to_sourceforge_cvs('bayonne')

se connectera de façon anonyme aux cvs du projet de bayonne.

Autres conseils

Si vous automatisez des programmes externes qui ont besoin d'entrée - comme mot de passe - votre meilleur pari serait probablement utiliser pexpect .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top