2010-06-19 10 views
3

J'essaie de démarrer un éditeur de texte (nano) à partir de Python, de demander à l'utilisateur de saisir du texte, puis de capturer le texte une fois qu'il est écrit (Control-O). Je n'ai pas travaillé avec le module subprocess avant, ni les tuyaux, donc je ne sais pas quoi essayer ensuite.Démarrer nano en tant que sous-processus à partir de python, saisir l'entrée

Jusqu'à présent, j'ai ce code:

a = subprocess.Popen('nano', stdout=subprocess.PIPE, shell=True) 

a doit capturer la sortie. Ce code, cependant, n'indique pas nano, et fait à la place se comporter bizarrement avec le terminal python. Les touches haut et bas (historique) cessent de fonctionner et la touche retour arrière devient dysfonctionnelle. Est-ce que quelqu'un peut me diriger dans la bonne direction pour résoudre ce problème? Je me rends compte que j'ai peut-être besoin de lire des tuyaux en Python, mais la seule information que je peux trouver est le module pipes et ça n'aide pas beaucoup.

Répondre

6

Control-O Nano écrit le fichier en cours d'édition, c.-à-pas à la sortie standard - donc, renoncer à la tentative de capturer stdout et juste lire le fichier une fois que l'utilisateur écrit dehors et sort Nano . Par exemple, sur mon Mac:

>>> import tempfile 
>>> f = tempfile.NamedTemporaryFile(mode='w+t', delete=False) 
>>> n = f.name 
>>> f.close() 
>>> import subprocess 
>>> subprocess.call(['nano', n]) 

Ici, j'écris "Bonjour tout le monde!" puis appuyez sur le contrôle-O Retour contrôle X et:

0 
>>> with open(n) as f: print f.read() 
... 
Hello world! 


>>> 
+0

Parfait, merci! – alecwh

+0

@alecwh, vous êtes les bienvenus! –

3

Je ne suis pas sûr que vous pouvez capturer ce que l'utilisateur est entré dans nano. Après tout, c'est le travail de nano.

Ce que vous pouvez (et je pense que vous devriez faire) pour obtenir des informations de la part d'un éditeur est de le générer avec un temporary file. Ensuite, lorsque l'utilisateur a entré ce qu'il veut, il sauve et quitte. Votre programme lit le contenu du fichier, puis le supprime. Créez l'éditeur en utilisant os.system. Votre terminal se comporte de manière amusante car nano est un programme en plein écran et utilisera des séquences d'échappement terminales (probablement via .maures) pour manipuler l'écran et le curseur. Si vous le spawatt unattached à un terminal, il se comportera mal.

De même, vous devriez envisager d'ouvrir $EDITOR s'il est défini plutôt que nano. C'est ce à quoi les gens s'attendraient.