Как упоминалось в @Rob answer, вы должны использовать subprocess
библиотека для прямого вызова vimdiff
и управления аргументами вместо их интерпретации оболочкой. (Это не причина, почему это не работает для вас, но решение включает в себя принятие subprocess
для управления потоками, передаваемыми порожденному vimdiff
, поэтому давайте сначала примем его.)
Вы можете использовать subprocess
для запуска эквивалентной команды:
subprocess.check_call(
[
"vimdiff",
old_file,
new_file,
"-c",
"TOhtml | w! diff.html | qa!"
],
)
Обратите внимание, что я объединил множество команд Vimscript, переданных как отдельные -c
, в одну, используя разделитель команд Vimscript |
, который хорошо работает в данном случае.
Теперь это все еще не удастся под daemon.DaemonContext()
, он создаст diff.html
, который, похоже, не включает старые и новые файлы (по большей части пустой шаблон html).
Чтобы решить эту проблему, вы можете явно перенаправить потоки (стандартный ввод, стандартный вывод и стандартная ошибка) на /dev/null
, чтобы vimdiff
не ждал пользовательского ввода (или не пытался отобразить вывод) и не застревал, пытаясь это сделать. .
Вы можете легко сделать это, используя subprocess
, передавая вызову дополнительные аргументы:
subprocess.check_call(
[
"vimdiff",
old_file,
new_file,
"-c",
"TOhtml | w! diff.html | qa!"
],
stdin=subprocess.DEVNULL,
stdout=subprocess.DEVNULL,
stderr=subprocess.DEVNULL,
)
Используя этот фрагмент, я получил diff.html
, который был очень похож на тот, который я создал, выполняя шаги вручную с vimdiff
. Единственная разница заключалась в том, что тот, который я создал, имел дополнительные пробелы в конце каждой строки в старом и новом файлах.
Оказывается, это произошло потому, что при интерактивном использовании vimdiff
определял размер моего терминала и использовал это конкретное количество столбцов на дисплее, в то время как то же самое было невозможно, когда потоки были перенаправлены на /dev/null
, и он не мог иметь доступ к терминалу, чтобы найти его настройки.
Если вы хотите изменить это, вы можете легко обойти это, установив 'columns'
a> явно в вашей команде Vimscript. Например, для ширины 160 столбцов:
subprocess.check_call(
[
"vimdiff",
old_file,
new_file,
"-c",
"set columns=160 | TOhtml | w! diff.html | qa!"
],
stdin=subprocess.DEVNULL,
stdout=subprocess.DEVNULL,
stderr=subprocess.DEVNULL,
)
Последнее препятствие, которое я обнаружил во время тестирования, заключалось в том, что daemon.DaemonContext()
изменит текущий каталог на /
(обычно это часть того, что влечет за собой настройка контекста демона), поэтому попытка записи в diff.html
в текущем каталоге, скорее всего, потерпит неудачу (если вы не иметь привилегии суперпользователя, а затем он будет записывать в корневой каталог, что, скорее всего, не то, что вам нужно.)
Вы можете исправить это, вызвав os.chdir()
внутри контекста демона чтобы перейти в каталог, в котором вы хотите создать файл diff.html
, или передав путь к этому каталогу в качестве именованного аргумента cwd=...
в subprocess.check_call()
.
person
filbranden
schedule
04.12.2020