2010-04-05 3 views
1

J'ai besoin d'une méthode pour obtenir les données d'un éditeur externe.Obtention de données à partir d'un programme externe

def _get_content(): 
    from subprocess import call 
    file = open(file, "w").write(some_name) 
    call(editor + " " + file, shell=True) 
    file.close() 
    file = open(file) 
    x = file.readlines() 

    [snip] 

Personnellement, je pense qu'il devrait y avoir une manière plus élégante. Vous voyez, j'ai besoin d'interagir avec un éditeur externe et d'obtenir les données.

Connaissez-vous de meilleures approches/de meilleures idées?

EDIT:

Marcelo m'a amené à l'idée d'utiliser tempfile pour le faire.

Voilà comment je le fais:

def _tempfile_write(input): 
    from tempfile import NamedTemporaryFile 

    x = NamedTemporaryFile() 
    x.file.write(input) 
    x.close() 
    y = open(x) 

    [snip] 

Ce fait le travail, mais aussi pas tout à fait satisfaisant. Entendu quelque chose au sujet du frai? ..

+1

Votre question est assez vague. Qu'est-ce que vous essayez exactement d'accomplir et que trouvez-vous laid à propos de cette approche? Est-ce que "j'ai besoin de l'utilisateur pour taper du texte et obtenir ce texte comme une chaîne"? Est-ce que "j'ai besoin de l'utilisateur pour éditer un fichier préexistant"? Demandez-vous comment générer un nouveau processus d'édition ou comment obtenir des informations de l'utilisateur? – RarrRarrRarr

+0

Je parle de l'obtention de l'entrée de l'utilisateur. :) J'avoue que moche n'est pas le bon mot ... peut-être en train de dire, je cherche une façon plus élégante de le faire (s'il y en a). –

Répondre

2

Je vous recommande d'utiliser une liste, pas une chaîne:

def _get_content(editor, initial=""): 
    from subprocess import call 
    from tempfile import NamedTemporaryFile 

    # Create the initial temporary file. 
    with NamedTemporaryFile(delete=False) as tf: 
     tfName = tf.name 
     tf.write(initial) 

    # Fire up the editor. 
    if call([editor, tfName]) != 0: 
     return None # Editor died or was killed. 

    # Get the modified content. 
    with open(tfName).readlines() as result: 
     os.remove(tfName) 
     return result 
+0

Merci Mike. C'est une bonne idée. –

+1

Gah, oublié la justification: Vous voulez utiliser une liste à 'call' et' shell = False' car alors vous n'avez pas à vous soucier d'échapper tous les caractères dans le nom de fichier (espace, '&', ';', etc.) que le shell donne une signification particulière à. Certes, 'NamedTemporaryFile' ne devrait pas vous donner un nom de fichier avec ces caractères, mais c'est une bonne habitude à prendre. –

+0

Merci pour cet indice! –

3

C'est la façon dont tous les programmes le font, AFAIK. Certainement, tous les systèmes de contrôle de version que j'ai utilisés créent un fichier temporaire, le transmettent à l'éditeur et récupèrent le résultat quand l'éditeur se termine, comme vous l'avez fait.

+0

La mention des fichiers temporaires était bonne. J'ai trouvé un bon module Python sur celui nommé '' tempfile''. Je pense que cela semble génial pour le début. –

1

Un éditeur vous permet de modifier un fichier de manière interactive. vous pouvez également éditer des fichiers avec Python. il n'y a pas besoin d'appeler un éditeur externe.

for line in open("file"): 
    print "editing line ", line 
    # eg replace strings 
    line = line.replace("somestring","somenewstring") 
    print line 
+0

Oui, je le sais. Bien que je doive obtenir la contribution de l'utilisateur et ensuite traiter immédiatement ces données, en stockant tout dans une base de données, sinon je le ferais juste de cette façon. :) –

Questions connexes