Называть текстовый редактор в скрипт Python, чтобы получить ввод пользователя


Мотивация

Я хочу знать, как интегрировать использование текстовых редакторах (например, в Emacs, Vim и т. д. и т. п.). в командной строке программы на Python.

Особенности

Я хочу быть в состоянии сделать следующее:

  • Называть текстовый редактор в программе для редактирования файла или буфера

  • Восстановить контроль после текстовый редактор выходит

  • Использовать временные файлы, т. е. не оставлять ничего валяться после того, как программа завершает свою работу

  • Заполнить файл или буфер с данными

  • Вам отредактированный текст обратно для использования в программе

Реализация

Я написал небольшой модуль по имени callvim.py (предаю свой предпочтительный выбор из текстового редактора), который создает временный файл, заполняет его с текстом, открывает его в текстовом редакторе (по умолчанию vim), и выводит измененный текст:

#!/usr/bin/env python
# -*- encoding: ascii -*-
"""callvim.py

Demonstrates calling a text-editor (e.g. Vim) from within a Python script,
including passing input to the editor and reading output from the editor.
"""

import tempfile
import os
from subprocess import call

# Get the text editor from the shell, otherwise default to Vim
EDITOR = os.environ.get('EDITOR','vim')

# Set initial input with which to populate the buffer
initial_message = "Hello world!"

# Open a temporary file to communicate through (`tempfile` should avoid any filename conflicts)
#
# NOTE: Don't autodelete the file on close!
#       We want to reopen the file incase the editor uses a swap-file.
#
with tempfile.NamedTemporaryFile(suffix=".tmp", delete=False) as tf:

    # Write the initial content to the file I/O buffer
    tf.write(initial_message)

    # Flush the I/O buffer to make sure the data is written to the file
    tf.flush()

    # Open the file with the text editor
    call([EDITOR, tf.name])

# Reopen the file to read the edited data
with open(tf.name, 'r') as tf:

    # Read the file data into a variable
    edited_message = tf.read()

    # Output the data
    print(edited_message)


312
5
задан 30 марта 2018 в 01:03 Источник Поделиться
Комментарии