Я делаю проект, где нам нужно видео сценария Python, записанного в редакторе. Мы имеем 100 + сценарии, таким образом, нам нужна автоматизация. Есть ли программа, в которой вход является Вашим сценарием Python, и вывод является видео, которое пишет тот код charactet символом в редакторе.
В то время как я должен сказать, что это "требование" звучит довольно странным, ничто не невозможно. Можно достигнуть этого с маленьким сценарием, когда я собираюсь показать ниже.
В первую очередь, мы должны установить некоторые инструменты. Это 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
Ваш курсор мыши изменится на некоторое перекрестие (не видимый в снимке экрана), и Вы получите пузырь уведомления просьба, чтобы Вы нажали целевое окно редактора теперь:
Сделайте, поскольку Вам говорят, но быть осторожными! Если Вы не хотели запускать запись, поражать Ctrl+C сразу, в то время как терминал все еще фокусируется и прежде, чем нажать где угодно.
Предупреждение!
Как только Вы нажимаете где угодно, сценарий сфокусирует то окно и начнет эмулировать все нажатия клавиш для ввода входного документа секунду спустя. Это не stoppable! После того как это запустилось, не касайтесь своей клавиатуры или нажимайте где угодно, пока это не закончилось! Иначе Ваш вход смешается с эмулированным входом и может инициировать непреднамеренные действия, как открытие/фокусировка других окон или сочетаний клавиш активации. Необходимо ожидать, пока это не останавливается самостоятельно!
Именно. Однажды законченный сценарий (отмечают, что после того, как запись сделана, возможно, все еще требовалось бы еще несколько секунд, чтобы представить и сохранить видео), можно открыть зарегистрированное видео и проверить результаты.
#!/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 )