Получение кода автоматизировано

Я делаю проект, где нам нужно видео сценария Python, записанного в редакторе. Мы имеем 100 + сценарии, таким образом, нам нужна автоматизация. Есть ли программа, в которой вход является Вашим сценарием Python, и вывод является видео, которое пишет тот код charactet символом в редакторе.

2
задан 15 April 2018 в 14:31

1 ответ

В то время как я должен сказать, что это "требование" звучит довольно странным, ничто не невозможно. Можно достигнуть этого с маленьким сценарием, когда я собираюсь показать ниже.


Подготовка

В первую очередь, мы должны установить некоторые инструменты. Это xdotool для эмуляции ввода и управления окном, и byzanz для видеозаписи. Установите их использование:

sudo apt install xdotool byzanz

Затем, скопируйте код в конце этого ответа и сохраните его как сценарий удара на Вашей машине, например, как ~/bin/typerec. Если Вы храните его в папке на Вашем $PATH, Вы сможете выполнить его, не указывая его путь. Не забывайте делать это исполняемым файлом впоследствии с помощью chmod +x PATH/TO/SCRIPT.


Использование

Теперь для записи ввода определенного файла сначала откройте целевого редактора, в которого мы введем. Удостоверьтесь, что это имеет любой вид "автоматического добавления отступа" выключенная функция, иначе добавление отступа введенного кода будет смешано!

Затем запустите мой сценарий, например, от терминала. Правильный синтаксис

typerec INPUT_FILE OUTPUT_FILE [DELAY]

где INPUT_FILE путь к Вашему текстовому файлу кода и OUTPUT_FILE путь выходного файла, где запись должна быть сохранена. Этому нужно было принять расширение byzanz, т.е. один из gif, webm, ogg, ogv, flv, byzanz (мои рекомендации полужирным). DELAY аргумент является дополнительным и устанавливает задержку между двумя нажатиями клавиш в миллисекундах. Значение по умолчанию равняется 20, если опущено, я рекомендую не понизиться 5.

Пример:

typerec /path/to/my/code.py ~/Videos/code.webm 100

Ваш курсор мыши изменится на некоторое перекрестие (не видимый в снимке экрана), и Вы получите пузырь уведомления просьба, чтобы Вы нажали целевое окно редактора теперь:

typerec "select target window" notification

Сделайте, поскольку Вам говорят, но быть осторожными! Если Вы не хотели запускать запись, поражать Ctrl+C сразу, в то время как терминал все еще фокусируется и прежде, чем нажать где угодно.

Предупреждение!
Как только Вы нажимаете где угодно, сценарий сфокусирует то окно и начнет эмулировать все нажатия клавиш для ввода входного документа секунду спустя. Это не stoppable! После того как это запустилось, не касайтесь своей клавиатуры или нажимайте где угодно, пока это не закончилось! Иначе Ваш вход смешается с эмулированным входом и может инициировать непреднамеренные действия, как открытие/фокусировка других окон или сочетаний клавиш активации. Необходимо ожидать, пока это не останавливается самостоятельно!

Именно. Однажды законченный сценарий (отмечают, что после того, как запись сделана, возможно, все еще требовалось бы еще несколько секунд, чтобы представить и сохранить видео), можно открыть зарегистрированное видео и проверить результаты.

Example output (input <code>~/.profile</code>, output <code>typerec.gif</code>, default delay of <code>20</code> ms)


Вот сценарий:

#!/bin/bash
THIS="$(basename "$0")"
INPUT_FILE="$1"
OUTPUT_FILE="$2"
DELAY="${3:-20}"

show_usage() {
    echo "  Usage:  $THIS INPUT_FILE OUTPUT_FILE [DELAY]"
    echo "where INPUT_FILE is the text file with the content to be typed"
    echo "and OUTPUT_FILE is where the recorded video shall get saved."
    echo "You can set the DELAY between keystrokes in ms (default 20)."
    echo "Note that OUTPUT_FILE will be overwritten if it exists already."
    echo "It must have one of the extensions {gif|webm|ogg|ogv|flv|byzanz}."
    exit 1
}

if [[ -z "$INPUT_FILE" || ! -r "$INPUT_FILE" ]] ; then
    echo "Missing INPUT_FILE argument or file is not existing or readable!"
    show_usage
fi
if [[ -z "$OUTPUT_FILE" ]] ; then
    echo "Missing OUTPUT_FILE argument!"
    show_usage
fi
if [[ ! "$DELAY" -gt 0 ]] ; then
    echo "Invalid argument for DELAY, must be a number > 0 or omitted."
    show_usage
fi

notify-send -i "media-record" "$THIS" "Please select your target editor window."
eval $(xdotool selectwindow getwindowgeometry --shell)
if [[ -z "$WINDOW" || -z "$X" || -z "$Y" || -z "$WIDTH" || -z "$HEIGHT" ]]; then
    echo "Failed to obtain all required target window information. Aborting."
    exit 2
fi

TYPE_COMMAND="xdotool windowactivate --sync \"$WINDOW\" \
              getactivewindow \
              windowfocus --sync \
              sleep 1 \
              type --clearmodifiers --delay "$DELAY" \
                   --file <( tr \\\\n \\\\r < \"$INPUT_FILE\" )"

byzanz-record -e "bash -c '$TYPE_COMMAND'" \
        -x "$X" -y "$Y" -w "$WIDTH" -h "$HEIGHT" \
        "$OUTPUT_FILE" &&

echo "Recording screencast and saving to $OUTPUT_FILE finished successfully."

Альтернативная острота

Если Вы предпочитаете не сохранять сценарий где-нибудь, острота, которую можно просто вставить в терминал, который в основном делает то же (но исключение входных параметров и проверок, записи file.txt как typerec.gif с задержкой 20 мс), ниже. Вы ответственны за редактирование его для использования корректных путей и проверки, что все корректно сами там.

( eval $(xdotool selectwindow getwindowgeometry --shell) ; byzanz-record -e "bash -c 'xdotool windowactivate --sync $WINDOW getactivewindow windowfocus --sync sleep 1 type --clearmodifiers --delay 20 --file <( tr \\\\n \\\\r < file.txt )'" -x $X -y $Y -w $WIDTH -h $HEIGHT typerec.gif )
3
ответ дан 2 December 2019 в 02:43

Другие вопросы по тегам:

Похожие вопросы: