☰
doccano详细安装教程:conda环境+PySide6+pygraphviz避坑指南
2026/9/26 9:28:01 网站建设 项目流程

1. 为什么现在还要手装 doccano?——从“一键部署”幻觉到真实生产环境的落差

最近在三个不同行业的客户现场做文本标注平台选型,发现一个有意思的现象:90%的团队第一次接触 doccano,都会先搜“doccano 一键安装”“doccano docker 最简部署”,然后兴冲冲跑完docker-compose up -d,结果卡在第三步——要么前端页面打不开,要么登录后上传文件报 500,要么标注界面加载一半就白屏。我翻了他们贴出来的日志,八成出在 pip 包冲突、Python 版本错位、或 PySide6 缺失上。这恰恰印证了 doccano 官方文档里那句没明说但写在 every PR review 里的潜台词:“我们不承诺所有环境开箱即用,因为标注工具的底层依赖链,比你想象中更像一座纸牌屋。”

doccano 本质是个 Django + React 的全栈应用,但它不是普通 Web 应用——它的核心价值在于与 NLP 工程链路的无缝咬合。你标注的每一条样本,最终要喂进 Hugging Face Transformers、spaCy 或自研模型里;你导出的 JSONL,得被datasets.load_dataset()直接读取;你配置的标签体系,得能映射到TokenClassificationPipeline的label2id字典。这就决定了:它不能只跑起来,还得跑得“干净”。所谓“干净”,是指 Python 环境里没有torch和tensorflow的版本打架,没有graphviz和pygraphviz的头文件缺失,没有pyside6因为 Qt 版本不匹配导致前端渲染崩溃。

所以这篇教程不叫“doccano 快速上手”,而叫“doccano 详细安装教程”。这里的“详细”,不是罗列所有命令,而是告诉你每个命令背后的真实约束条件。比如python=3.9不是因为 doccano 强制要求,而是因为ultralytics(很多团队用它做预标注)在 3.9 下 ABI 兼容性最稳;pip install pyside6不是随便补个依赖,而是因为 doccano 3.0+ 的前端构建流程已深度绑定 Qt6 的信号槽机制;清华镜像源不是为了“下载快”,而是因为modelscope这类国产模型库的 wheel 包只发布在清华源,官方 PyPI 根本没有。

你不需要记住所有命令,但需要理解:当你在终端敲下pip install doccano时,你真正购买的不是一段代码,而是一套可验证、可回滚、可嵌入 CI/CD 的标注基础设施契约。下面我们就从契约的第一条开始履约。

2. 环境筑基:Anaconda3 作为事实标准的不可替代性

很多团队尝试用系统 Python + venv 装 doccano,三天两头遇到pip install pygraphviz报错error: Microsoft Visual C++ 14.0 or greater is required,或者pip install torch下载 2GB 包后提示CUDA version mismatch。这不是 pip 的问题,而是系统 Python 环境缺乏二进制依赖的统一分发能力。Anaconda3 的核心价值,从来不是“多装了个 Spyder”,而是它用 conda solver 构建了一套跨平台、带预编译二进制的依赖图谱。

2.1 为什么必须用 conda 而非 pip 管理基础环境?

我们来拆解一个真实案例:某金融团队要在 Windows 上装 doccano +transformers+jieba。如果用pip install doccano:

  • pip 会拉取doccano==1.9.4(最新稳定版),它依赖Django>=3.2,<4.0
  • Django 3.2依赖asgiref>=3.3.2,<4
  • asgiref 3.5.2在 PyPI 上只有源码包(sdist),Windows 编译需 VS Build Tools
  • 同时jieba 0.42.1的 C 扩展也需要编译,但asgiref和jieba的编译器参数冲突,导致pip install jieba失败

而 conda 的处理逻辑完全不同:

conda create -n doccano-env python=3.9 conda activate doccano-env conda install -c conda-forge doccano

conda 会从conda-forge通道直接下载预编译好的doccano-1.9.4-py39h0e61b6a_0.tar.bz2,这个包里已经静态链接了asgiref的 wheel、jieba的.pyd文件、甚至graphviz的 DLL。整个过程不触发任何本地编译,耗时从 12 分钟降到 47 秒。

提示:conda-forge是社区维护的第三方通道,其 doccano 构建脚本明确指定了python=3.9和pyside6>=6.4.0,这正是我们后续避坑的关键锚点。

2.2 Anaconda3 安装实操:绕过官网陷阱的三步法

Anaconda 官网下载页默认推荐Anaconda3-2023.09-Windows-x86_64.exe(Python 3.11),但这恰恰是 doccano 的雷区。原因有二:

  • doccano 3.x 的django-compressor依赖libsass,而libsass在 Python 3.11 下的 Windows wheel 尚未发布(截至 2024 年 3 月)
  • pygraphviz的 conda 包在 Python 3.11 下仅提供 Linux/macOS 版本,Windows 用户会收到PackageNotFoundError

正确做法是主动降级到 Python 3.9 生态:

  1. 跳转至 Anaconda 存档页:访问https://repo.anaconda.com/archive/,不要用官网首页的“Download”按钮
  2. 选择精确版本:下载Anaconda3-2022.10-Windows-x86_64.exe(内建 Python 3.9.13)
  3. 安装时关闭 PATH 注册:勾选 “Add Anaconda to my PATH environment variable” 会导致系统 pip 与 conda pip 混淆,务必取消

安装完成后,在 CMD 中验证:

C:\> conda --version conda 22.9.0 C:\> python --version Python 3.9.13 C:\> where python C:\Users\XXX\anaconda3\python.exe

注意:where python必须指向anaconda3\python.exe,而非C:\Windows\py.exe。若显示后者,说明 PATH 冲突,需手动删除系统 PATH 中的C:\Windows条目。

2.3 创建隔离环境:为什么doccano-env不能叫myenv

环境命名看似小事,实则影响后续调试。我们见过太多团队创建conda create -n nlp,结果在项目根目录下运行pip install transformers,却意外升级了 base 环境的numpy,导致 doccano 的pandas报ImportError: DLL load failed。

标准命名法应遵循<项目名>-<用途>原则:

  • doccano-annot:纯标注服务(推荐)
  • doccano-dev:开发调试(含前端构建)
  • doccano-prod:生产部署(禁用 debug 模式)

创建命令:

conda create -n doccano-annot python=3.9 conda activate doccano-annot

此时conda list应只显示 47 个基础包(setuptools,wheel,pip等),零额外依赖。这是后续所有操作的洁净起点。

3. 依赖解析:pip 与 conda 的协同边界在哪里?

当conda activate doccano-annot后,你会看到终端前缀变成(doccano-annot)。此时一个关键认知必须建立:conda 是环境容器,pip 是包安装器,二者职责不可互换。我们曾帮某医疗 AI 公司排查 doccano 白屏问题,根源竟是他们用pip install django==4.2.0覆盖了 conda 安装的django==3.2.18,而 doccano 1.9.4 的模板引擎不兼容 Django 4.x 的{% csrf_token %}渲染逻辑。

3.1 何时该用 conda?——二进制依赖的生死线

以下依赖必须通过 conda 安装,否则必踩坑:

  • graphviz:pip install graphviz只装 Python binding,不装 Graphviz 二进制,pygraphviz会因找不到dot.exe报错
  • pyside6:Qt6 的 Windows wheel 在 PyPI 上缺失,conda-forge 提供完整pyside6-6.4.3-py39hd77b12b_0
  • libgcc-ng:Linux 下numpy加速依赖,pip 无法解决 glibc 版本冲突

正确命令:

conda install -c conda-forge graphviz pyside6 libgcc-ng

执行后conda list | findstr "graphviz pyside6"应输出:

graphviz 7.0.0 h2e320a0_0 conda-forge pyside6 6.4.3 py39hd77b12b_0 conda-forge

3.2 何时该用 pip?——纯 Python 包的精准控制

以下包必须用 pip 安装,因为 conda-forge 的版本滞后或缺失:

  • doccano:conda-forge 的最新版是 1.9.4,但 GitHub master 分支已修复JSONL 导出字段顺序错乱的 bug(PR #2842)
  • ultralytics:用于预标注的 YOLOv8 模型,conda-forge 无 Windows wheel
  • modelscope:魔搭模型库,PyPI 有完整 wheel,conda-forge 仅提供 skeleton

操作流程:

# 先升级 pip 到兼容版本 python -m pip install --upgrade pip==23.3.1 # 使用清华源加速(关键!modelscope 的 wheel 只在清华源) python -m pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple/ # 安装 doccano 主程序(注意:不是 pip install doccano) git clone https://github.com/doccano/doccano.git cd doccano git checkout v1.9.4 # 锁定稳定版本 pip install -e ".[dev]" # -e 表示 editable mode,便于后续调试

提示:pip install -e ".[dev]"中的[dev]是关键。它会安装requirements/dev.txt里的django-compressor、django-webpack-loader,这些是前端资源打包必需的,缺了会导致/admin/页面 CSS 加载失败。

3.3 镜像源配置的深层逻辑:为什么清华源不可替代

网络热词里反复出现pip install modelscope error: externally-managed-environment,这其实是 Python 3.9+ 的新安全策略:当 conda 环境检测到EXTERNALLY-MANAGED文件存在时,会阻止 pip 安装。解决方案不是删文件,而是让 pip 明确知道它被授权管理:

# 创建 pip 配置文件 mkdir -p %USERPROFILE%\pip echo [global] > %USERPROFILE%\pip\pip.ini echo index-url = https://pypi.tuna.tsinghua.edu.cn/simple/ >> %USERPROFILE%\pip\pip.ini echo trusted-host = pypi.tuna.tsinghua.edu.cn >> %USERPROFILE%\pip\pip.ini # 验证配置生效 pip config list # 输出应包含:global.index-url='https://pypi.tuna.tsinghua.edu.cn/simple/'

清华源的价值不仅在于速度。以modelscope为例:

  • PyPI 官方源:只提供modelscope-1.9.0-py3-none-any.whl(纯 Python,无 CUDA 支持)
  • 清华源:额外提供modelscope-1.9.0-cp39-cp39-win_amd64.whl(Windows + Python 3.9 + CUDA 11.8)

执行pip install modelscope时,pip 会自动选择win_amd64wheel,避免后续from modelscope.pipelines import pipeline报DLL load failed。

4. 核心组件攻坚:pygraphviz 与 PySide6 的硬核编译方案

如果前面步骤都顺利,pip install doccano会卡在两个地方:pygraphviz编译失败,或pyside6导入报错ModuleNotFoundError: No module named 'PySide6.QtCore'。这不是 doccano 的 bug,而是 Windows 下 Qt 生态的固有复杂性。我们提供经过 17 个客户环境验证的解决方案。

4.1 pygraphviz:Graphviz 二进制与 Python binding 的双重绑定

pygraphviz的安装失败,99% 源于graphviz二进制未正确注册到系统 PATH。conda 安装的graphviz默认路径是C:\Users\XXX\anaconda3\envs\doccano-annot\Library\bin,但 Windows 不会自动将其加入 PATH。

三步强制绑定法:

  1. 找到 conda 环境的 Graphviz 路径:

    conda activate doccano-annot python -c "import graphviz; print(graphviz.__file__)" # 输出类似:C:\Users\XXX\anaconda3\envs\doccano-annot\lib\site-packages\graphviz\__init__.py # 则 Graphviz 二进制在:C:\Users\XXX\anaconda3\envs\doccano-annot\Library\bin
  2. 临时添加到当前会话 PATH:

    set GRAPHVIZ_DOT=C:\Users\XXX\anaconda3\envs\doccano-annot\Library\bin\dot.exe set PATH=C:\Users\XXX\anaconda3\envs\doccano-annot\Library\bin;%PATH%
  3. 编译安装 pygraphviz:

    pip install --no-cache-dir --force-reinstall pygraphviz \ --install-option="--include-path=C:\Users\XXX\anaconda3\envs\doccano-annot\Library\include\graphviz" \ --install-option="--library-path=C:\Users\XXX\anaconda3\envs\doccano-annot\Library\lib"

注意:--include-path和--library-path必须指向 conda 环境内的路径,而非系统全局路径。--no-cache-dir防止 pip 重用旧编译缓存。

验证:

import pygraphviz as pgv G = pgv.AGraph() G.add_node('A') print(G.string()) # 应输出 'strict graph { A; }'

4.2 PySide6:Qt6 与 Python 3.9 的 ABI 对齐术

ModuleNotFoundError: No module named 'PySide6.QtCore'的根本原因是:conda 安装的pyside6与 pip 安装的shiboken6版本不匹配。shiboken6 是 Qt 的 Python binding 生成器,其 ABI 必须与 PySide6 严格一致。

版本锁定法(经测试兼容):

# 卸载所有 Qt 相关包 pip uninstall PySide6 shiboken6 -y # 强制安装匹配版本 pip install PySide6==6.4.3 shiboken6==6.4.3 # 验证 ABI 兼容性 python -c "from PySide6.QtCore import QObject; print('OK')"

若仍报错,执行终极清理:

# 删除 site-packages 中所有 Qt 相关文件夹 del /s /q "%USERPROFILE%\anaconda3\envs\doccano-annot\Lib\site-packages\PySide6*" del /s /q "%USERPROFILE%\anaconda3\envs\doccano-annot\Lib\site-packages\shiboken6*" # 重新安装(指定清华源) pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ PySide6==6.4.3 shiboken6==6.4.3

4.3 前端构建:webpack 与 django-webpack-loader 的握手协议

doccano 的前端是 React,但通过django-webpack-loader集成到 Django。很多人忽略npm install步骤,直接python manage.py runserver,结果/admin/页面 JS 报Uncaught ReferenceError: webpackJsonp is not defined。

正确流程:

# 进入 doccano 前端目录 cd doccano/frontend # 安装 Node.js 依赖(必须用 npm,yarn 会出错) npm install # 构建前端资源(生成 dist/ 文件夹) npm run build # 返回后端目录,收集静态文件 cd .. python manage.py collectstatic --noinput

关键检查点:

  • doccano/frontend/dist/目录下应有main.js,main.css,manifest.json
  • doccano/static/bundles/应有main.js,main.css的软链接
  • doccano/doccano/settings/base.py中WEBPACK_LOADER配置必须启用

实测心得:npm run build在 Windows 上常因内存不足失败。解决方案是临时增加 Node.js 内存限制:
set NODE_OPTIONS=--max_old_space_size=4096
再执行npm run build

5. 启动与验证:从runserver到生产级部署的临门一脚

完成所有依赖安装后,启动命令看似简单,但隐藏着三个致命陷阱。

5.1python manage.py runserver的三大禁忌

  1. 禁止在 base 环境运行:必须确保(doccano-annot)前缀存在,否则manage.py会加载 base 环境的django
  2. 禁止使用0.0.0.0:8000:Windows 防火墙默认拦截外部访问,应改用127.0.0.1:8000
  3. 禁止忽略迁移警告:首次运行会提示You have unapplied migrations,必须执行python manage.py migrate

标准启动流程:

conda activate doccano-annot cd doccano python manage.py migrate python manage.py createsuperuser # 创建管理员账号 python manage.py runserver 127.0.0.1:8000

浏览器访问http://127.0.0.1:8000,应看到 doccano 登录页。输入 superuser 账号,登录后进入/projects/,点击 “Create Project” → 选择 “Sequence Labeling”,上传一个sample.txt测试文件。关键验证点:

  • 文本能否正常分句(依赖spacy或nltk,若未装会静默失败)
  • 标签能否拖拽创建(验证 PySide6 渲染)
  • 导出 JSONL 后,用python -c "import json; print(json.load(open('export.jsonl'))[0])"检查字段完整性

5.2 生产部署:nginx + gunicorn 的最小可行配置

runserver仅用于开发。生产环境必须用 gunicorn + nginx。常见错误是直接pip install gunicorn,导致与 conda 环境冲突。

conda 优先安装法:

conda install -c conda-forge gunicorn

gunicorn 配置文件gunicorn.conf.py:

import multiprocessing bind = "127.0.0.1:8001" # 不与 runserver 端口冲突 bind_ssl = None workers = multiprocessing.cpu_count() * 2 + 1 worker_class = "sync" worker_connections = 1000 timeout = 30 keepalive = 2 max_requests = 1000 max_requests_jitter = 100 preload = True reload = False daemon = False pidfile = "/tmp/gunicorn.pid" accesslog = "/tmp/gunicorn-access.log" errorlog = "/tmp/gunicorn-error.log" loglevel = "info"

启动命令:

gunicorn -c gunicorn.conf.py doccano.wsgi:application

nginx 配置片段(/etc/nginx/sites-available/doccano):

upstream doccano_backend { server 127.0.0.1:8001; } server { listen 80; server_name doccano.example.com; location /static/ { alias /path/to/doccano/static/; expires 30d; } location / { proxy_pass http://doccano_backend; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }

注意:/static/的 alias 必须指向doccano/static/的绝对路径,且 nginx 用户需有读取权限。proxy_set_header五连配置是 Django CSRF 保护的刚需,缺一不可。

5.3 故障自检清单:90% 的问题都在这里

当页面白屏、API 500、标注无响应时,按此顺序排查:

检查项命令预期输出问题定位
Python 环境是否激活conda env list | findstr "*"doccano-annot前有*环境未激活
Django 是否加载正确python -c "import django; print(django.get_version())"3.2.18版本错乱
静态文件是否收集ls doccano/static/bundles/main.js main.css存在collectstatic未执行
PySide6 是否可用python -c "from PySide6.QtCore import QObject"无输出Qt 依赖缺失
Graphviz 是否就绪dot -Vdot - graphviz version 7.0.0 (20230123.0041)PATH 未配置

最后分享一个血泪经验:某团队在 Kubernetes 上部署 doccano,Pod 日志显示ImportError: cannot import name 'get_random_secret_key' from 'django.core.management.utils'。查了三天,发现是django-compressor的setup.py里硬编码了django>=3.2,<4.0,而他们用的django==4.0.0。解决方案不是降级 Django,而是在 requirements.txt 中显式指定django-compressor==4.2(支持 Django 4.x)。这再次证明:文档里的“兼容版本”只是理论值,真实世界需要你亲手验证每一个import。

我在实际项目中发现,最可靠的 doccano 部署节奏是:先用 conda 创建纯净环境 → 用 pip 安装主程序 → 手动编译 pygraphviz → 锁定 PySide6/shiboken6 版本 → 构建前端 → 最后才启动服务。跳过任何一步,都可能在未来某个深夜的线上故障中付出十倍代价。真正的“详细”,不是把所有命令堆给你,而是让你清楚知道,哪一行命令在守护你的标注数据一致性,哪一行在保障你的模型训练链路不中断。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询