2010-04-05 3 views
1

Мне нужен способ получения данных из внешнего редактора.Получение данных из внешней программы

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] 

Я лично считаю, что должен быть более элегантный способ. Видите ли, мне нужно взаимодействовать с внешним редактором и получать данные.

Знаете ли вы, что лучше подходит/имеет лучшие идеи?

EDIT:

Марсело привел меня на идее использования tempfile за это.

Вот как я это делаю:

def _tempfile_write(input): 
    from tempfile import NamedTemporaryFile 

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

    [snip] 

Это делает работу, но и не вполне удовлетворительна. Слышал что-нибудь о нерестах? ..

+1

Ваш вопрос довольно расплывчатым. Что именно вы пытаетесь выполнить и что вы считаете уродливым в этом подходе? «Мне нужно, чтобы пользователь вводил текст и получал этот текст в виде строки»? «Мне нужно, чтобы пользователь редактировал ранее существующий файл»? Вы спрашиваете, как создать новый процесс редактора или как получить вход от пользователя? – RarrRarrRarr

+0

Я говорю о получении ввода от пользователя. :) Я признаю, что уродливое - это не правильное слово ... возможно, говоря: я ищу более элегантный способ сделать это (если есть). –

ответ

2

Я бы рекомендовал использовать список, а не строка:

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

Спасибо, Майк. Это хорошая идея. –

+1

Gah, забыли оправдание: вы хотите использовать список для 'call' и' shell = False', потому что вам не нужно беспокоиться об экранировании любых символов в имени файла (пробел, '&', ';' и т. Д.), Который оболочка дает особое значение. Конечно, 'NamedTemporaryFile' не должен давать вам имя файла с этими символами, но это хорошая привычка. –

+0

Спасибо за этот намек! –

3

Так все программы делают это, AFAIK. Конечно, все системы управления версиями, которые я использовал, создают временный файл, передают его в редактор и извлекают результат, когда редактор выходит, как и у вас.

+0

Упоминание временных файлов было хорошим .. Я нашел хороший модуль Python на том, что называется '' tempfile''. Я думаю, это здорово для начала. –

1

Редактор позволяет редактировать файл в интерактивном режиме. вы также можете редактировать файлы с помощью Python. нет необходимости вызывать внешний редактор.

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

Да, я это знаю. Хотя мне нужно получить пользовательский ввод, а затем немедленно обработать эти данные, сохранив все это в базе данных, иначе я бы сделал это именно так. :) –

Смежные вопросы