自动化代码捕获

自动化代码捕获

我正在做一个项目,我们需要一个在编辑器中编写 Python 脚本的视频。我们有 100 多个脚本,所以我们需要自动化。有没有一个程序,其中输入是您的 Python 脚本,输出是一个在编辑器中逐个字符写入该代码的视频。

答案1

虽然我必须说这个“要求”听起来很奇怪,但没有什么是不可能的。您可以使用一个小脚本来实现这一点,正如我将在下面展示的那样。


准备

首先,我们需要安装一些工具。这些工具xdotool用于打字模拟和窗口控制,以及byzanz视频录制。使用以下命令安装它们:

sudo apt install xdotool byzanz

接下来,复制本答案末尾的代码并将其保存为计算机上的 bash 脚本,例如~/bin/typerec。如果您将其存储在 上的文件夹中$PATH,则无需指定其路径即可执行它。不要忘记之后使用 使其可执行chmod +x PATH/TO/SCRIPT


用法

现在要记录特定文件的输入,首先打开我们要输入的目标编辑器。确保它已关闭任何类型的“自动缩进”功能,否则输入的代码的缩进会很乱!

然后从终端启动我的脚本。正确的语法是

typerec INPUT_FILE OUTPUT_FILE [DELAY]

其中INPUT_FILE是代码文本文件的路径,OUTPUT_FILE是应存储录音的输出文件路径。它必须具有 接受的扩展名byzanz,即以下之一gifwebmogg,,,(我的建议以粗体显示)。该参数是可选的,用于设置两次击键之间的延迟(以毫秒为单位)。如果省略,则默认值为 20,我建议不要低于ogv5 flvbyzanzDELAY

例子:

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

您的鼠标光标将变成某种十字线(在屏幕截图中不可见),并且您将收到一个通知气泡,要求您立即单击目标编辑器窗口:

typerec“选择目标窗口”通知

按照你说的做,但是当心! 如果您不想开始录制,请在终端仍处于焦点状态且未单击任何位置时立即按Ctrl+ 。C

警告!
只要您单击任意位置,脚本就会聚焦该窗口并开始模拟所有击键,以便在一秒钟后输入您的输入文档。这是无法停止的!一旦开始,在完成之前,请勿触摸键盘或单击任何地方! 否则,您的输入将与模拟输入混合,并可能触发意外操作,例如打开/聚焦其他窗口或激活键盘快捷键。您必须等到它自行停止!

就是这样。脚本完成后(请注意,录制完成后,可能仍需要几秒钟来渲染和保存视频),您可以打开录制的视频并检查结果。

示例输出(输入 <code>~/.profile</code>,输出 <code>typerec.gif</code>,默认延迟 <code>20</code> 毫秒)


脚本如下:

#!/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.txttyperec.gif20 毫秒)。您有责任编辑它以使用正确的路径并确保那里的一切都正确无误。

( 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 )

相关内容