Получение данных из внешней программы - PullRequest
1 голос
/ 05 апреля 2010

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

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]

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

Ответы [ 3 ]

3 голосов
/ 05 апреля 2010

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

2 голосов
/ 06 апреля 2010

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

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
1 голос
/ 05 апреля 2010

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

for line in open("file"):
    print "editing line ", line
    # eg replace strings
    line = line.replace("somestring","somenewstring")
    print line
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...