subprocess Spawn qui attend une entrée console sans bloquer?
-
21-08-2019 - |
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
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 .