2011-01-26 6 views
1

Je suis en train d'écrire une abstraction sur darcs en python, mais une fois que j'essaye d'envoyer des données à mon dépôt, le repository demande une clé; Je pensais qu'il était possible de faire en sorte que python envoie des clés à darcs, en utilisant stdin, ou quoi que ce soit, pour émuler ce que l'utilisateur taperait, puisque de cette façon; Je pourrais permettre aux utilisateurs de simplement stocker un fichier avec leurs informations, et python lirait simplement ce fichier et déclencherait son contenu.Python, faking stdin

def execute(cmd): 
    proc = subprocess.Popen(cmd, shell=True) 
    proc.wait() 

Le code que j'utilise pour lancer darcs; execute ("darcs% de" % (les parems))

+0

Comment êtes-vous lance darcs? Via le sous-processus? – delnan

+0

subprocess.Popen (commande, shell = True) - oui exactement – Skeen

+0

Eh bien, jusqu'où en êtes-vous? Utilisez-vous 'stdin = subprocess.PIPE' et' .communicate() '? Montrez-nous votre code. –

Répondre

3

Utilisez les subprocess module:

Le module subprocess vous permet de frayer de nouveaux processus, se connecter à leurs entrées/sorties/tuyaux d'erreur, et d'obtenir leur retour codes.

Le procédé subprocess.Popen.communicate est utilisé pour les communications:

Popen.communicate(input=None)

Interagir avec le processus: Envoyer des données à l'entrée standard. Lire les données de stdout et stderr, jusqu'à ce que la fin du fichier soit atteinte. Attendez que le processus se termine. L'argument d'entrée facultatif doit être une chaîne à envoyer au processus enfant ou None, si aucune donnée ne doit être envoyée à l'enfant. Communique() renvoie un tuple (stdoutdata, stderrdata)

Notez que si vous souhaitez envoyer des données à stdin du processus, vous devez créer l'objet Popen avec stdin=PIPE. De même, pour obtenir autre chose que None dans le tuple de résultat, vous devez également donner stdout=PIPE et/ou stderr=PIPE.

+0

J'utilise ce module pour créer le processus, mais je ne sais pas exactement comment connecter les tuyaux. – Skeen

+0

Je pense que ce sera la solution pour moi :) – Skeen

+0

@Skeen, intéressant.C'est une solution assez simple et la plupart des gens pensaient que vous aviez besoin de pexpect de votre question originale. Merci. Content que votre problème soit résolu. –

4

Essayez pexpect, qui est construit exactement à cette fin (automatisation d'autres applications interactives).

Voir: http://pypi.python.org/pypi/pexpect/

Un exemple d'utilisation de la documentation:

import pexpect 
    child = pexpect.spawn ('ftp ftp.openbsd.org') 
    child.expect ('Name .*: ') 
    child.sendline ('anonymous') 
    child.expect ('Password:') 
    child.sendline ('[email protected]') 
    child.expect ('ftp> ') 
    child.sendline ('cd pub') 
    child.expect('ftp> ') 
    child.sendline ('get ls-lR.gz') 
    child.expect('ftp> ') 
    child.sendline ('bye') 
+0

Cela ressemble vraiment à ce que je cherche :) - Je suppose que l'attente attend juste sur stdout? et sendline juste alimente stdin? – Skeen

+0

Oui, il supprime tous les détails de stdin/stdout dans votre sous-processus. – payne

+0

ne semble pas fonctionner sur Windows – Skeen