Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

26 环境与 harness

✅ 已验证

本机

Fedora 44 · Krita 6.0.2.1(RPM)· PyQt6 · Xvfb · Python 3.14(numpy / scipy / scikit-learn / Pillow / matplotlib)· 46 GB 内存 · RTX 5070 Ti 16 GB(本书没用到 GPU)。

sudo dnf install krita python3-numpy python3-pillow python3-scipy python3-scikit-learn xorg-x11-server-Xvfb

装 RPM 不要装 Flatpak:Flatpak 的沙箱 Python 没有 numpy,路径还会被搬到 ~/.var/app/org.kde.krita/

必须 Krita 6.0+Node.paintLine / paintPath 是 6.0 新增的,是整套东西的地基。5.x 要走 tablet event 注入,每一条都要单独调试(坐标标定不可知、笔触只能落在第一层、saveAs 段错误、吞吐只有 200–600 笔/分)。本书代码不兼容 5.x。

harness:一个独立的 HOME

code/setup_fedora.sh <harness目录> <输出目录> 生成 krita-bot/

krita-bot/
  run_job.sh                       启动脚本
  .config/kritarc                  最小配置: 关 autosave
  .local/share/krita/pykrita/autopaint/   一个 Krita 扩展: 启动 3s 后 exec $KRITA_JOB, 跑完退出
  *.py                             code/ 的副本

用独立 HOME 的两个理由:批量作业的配置不污染你自己的 Krita 偏好;rm *autosave*.kra 删不到你真正的恢复文件。

run_job.sh 做的事:

export HOME=<harness>  XDG_RUNTIME_DIR=/tmp/xdg-kritabot  LANG=C.UTF-8  PYTHONIOENCODING=utf-8
export KRITA_JOB="$(realpath "$1")"      # 所有路径在 cd 之前转绝对
cd "$HOME"; rm -f *autosave*.kra           # 残留的 autosave 会弹恢复对话框, 卡死之后每一次
xvfb-run -a -s "-screen 0 1600x1200x24" krita --nosplash     # 或 --gui 在真实桌面上看

改完 code/ 必须重跑 ./paint setup——harness 跑的是副本。setup_fedora.shrm -f 再 cp:只 cp 不删的话,改过名的旧模块会原地留下,漏改的 import 继续跑通而不报错。

四个环境级的坑

症状
QT_QPA_PLATFORM=offscreenKrita 6 启动即段错误必须 Xvfb 或真实 display
只设 LANG 不设 PYTHONIOENCODINGprint("中文") 在作业跑到一半时抛 UnicodeEncodeError两个都设;读作业文件也要 encoding='utf-8'
崩溃留下的 autosave之后每次运行无错误、无 traceback、持续失败启动前 rm -f *autosave*.kraEnableAutosave=false
没有 view 时调 paint*段错误,C++ 层,无 Python tracebackSession.__init__addView;自己建文档必须也建

作业的骨架

import os, sys
sys.path.insert(0, os.path.expanduser("~"))     # harness 就是 HOME, code/ 的副本在这
from canvas import *

s = Session(W, H, "作品名", journal=True)          # document + view + 输出目录
...                                                 # 建树、落笔
s.stage("标签")                                     # 存一张 stages/NN-标签.png
s.final()                                           # final.png + final.kra + layers.json

Session 的输出根是 $ART_OUT./paint 会设好。

自检

./paint checkcode/job_selfcheck.py,31 项,每项真跑一遍看像素:版本 ≥ 6 / ground / preset / stroke / path / ellipse / selection 限制与取消 / select_mask 羽化 / erase / filter box / blending / stage 与 final 落盘 / 目录布局 / build 建树 / 嵌套顺序 / GroupLayer 类型 / find 寻址 / by_role / by_label / 重名拒绝 / clipping / 局部 box 读写 / manifest / .kra 往返(层数、clip、blend/opacity/label)。

改了 canvas.py 之后必须全过。