ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

PyCharm中pip install报Disk quota exceeded的排查与解决

PyCharm中pip install报Disk quota exceeded的排查与解决 磁盘满了别慌PyCharm 里 pip install 报 Disk quota exceeded 的完整排查与解决过程最近在 PyCharm 里装一个带 torch 的深度学习依赖库pip install 跑到一半直接红字报错末尾写着OSError: [Errno 122] Disk quota exceeded。第一反应是“我磁盘没满啊C 盘还剩几十 G”可报错就那么实实在在地躺着。后来查了一圈发现这个错在 PyCharm 场景下有几种完全不同的触发原因而且大部分人都容易踩进同一个思维误区一看到 disk quota 就急着删文件其实问题常常不在文件大小而在 inode 数量、系统临时目录权限、甚至是 PyCharm 自带终端的缓存策略。这篇就把我这次的完整排查过程、原理拆解、以及最终能用的解决步骤都写下来。如果你也遇到Disk quota exceeded或者类似的No space left on device可以先按这个思路走一遍大概率比直接重装 PyCharm 或者清理 C 盘管用。1. 先说清楚这个报错的真实含义1.1 Errno 122 和你平时看到的“磁盘满”不是一回事Linux/Unix 系统里的Disk quota exceeded对应的错误码是EDQUOT也就是 Errno 122。它和我们常见的ENOSPCNo space left on deviceErrno 28有本质区别ENOSPC表示整个磁盘的容量被占满了比如你的 C 盘、D 盘或者 Linux 的根分区空间不足。EDQUOT表示文件系统层面有配额限制可能是针对用户、项目目录、或者某个挂载点的 inode文件个数进行了限制。即使磁盘还有大量空闲一旦你的用户达到了配额上限系统照样拒绝写入。打个比方磁盘容量是停车场配额是某个用户在这个停车场里最多能停几辆车的数量。哪怕整个停车场还有空车位但只要你的配额用完了管理员就不让你再开进来。很多 PyCharm 用户在 Windows 上也看到了这个Errno 122比如安装 PySide6 时出现error: could not install packages due to an oserror: [winerror 32] 另一个程序正在使用此文件还有OSError: [Errno 122] Disk quota exceeded。Windows 本身没有 Unix 的 quota 概念但如果你把 Python 环境装在网络映射盘、WSL、或者某些云同步盘里就可能被这些文件系统自带的配额机制拦住。1.2 在 PyCharm 控制台里出现这个错最常见的三类场景根据我实际排查和网上各路开发者的反馈PyCharm 里报Disk quota exceeded大致能归结成三类目标磁盘真的触发了配额限制比如你用的是公司电脑、云主机、或者学校服务器管理员对每个用户设置了磁盘配额而你的 pip 缓存和虚拟环境把配额用尽了。临时目录 / 缓存目录空间不足pip 在安装包时会先下载 wheel 到缓存目录再解压安装。如果TEMP、TMPDIR或者pip cache所在分区空间不够就会触发奇怪的错误。文件数量inode用尽这个最隐蔽。很多文件系统对单个目录下的文件数量有限制或者用户的 inode 配额满了。pip 解压大量源码文件时会创建成千上万个小文件一旦 inode 耗尽就会报磁盘配额错误而不是容量错误。另外还有一个 PyCharm 特有的情况PyCharm 自带的 Terminal 和 Python Console 默认会加载虚拟环境的activate脚本同时还会在后台为每个项目建立索引缓存。如果项目目录位于一个配额紧张的挂载点或者 PyCharm 的system目录路径指向了一个被限制的分区即使你的项目本身没多大索引缓存也可能把配额撑爆。我自己遇到的情况就更特殊项目在/data/project挂载在公司的用户配额盘上但 PyCharm 的idea.system.path默认在~/.cache/JetBrains而 home 目录也挂在同一个配额盘。最后查出来根本不是项目占空间大而是 PyCharm 的索引缓存和 pip 下载缓存加在一起把用户配额吃光了。2. 动手之前先做这几个命令诊断别瞎清理2.1 用 df 和 quota 确认到底是容量还是配额在 PyCharm 的 Terminal注意是项目自带终端不是系统外部终端里依次执行这几条命令能快速定位问题范围df -h df -idf -h看容量使用率确认是不是磁盘真的满了。df -i看 inode 使用率如果IUse%达到 100%那就说明文件数量上限触顶了。如果这两个都正常再查看配额quota -u $USER没有quota命令的话可以读一下挂载信息mount | grep quota如果你是普通用户且没有权限查配额可以直接在报错目录下尝试创建一个测试文件touch testfile echo write ok testfile rm testfile如果 touch 或写入失败就能确认这个目录所在的文件系统确实不让写了。注意在 PyCharm 里跑这些命令时建议把 Python 解释器切换成系统自带 Python或者先退出虚拟环境再测试。否则你看到的路径、环境变量可能都被虚拟环境影响。2.2 检查 pip 缓存和 PyCharm 缓存的位置pip 默认缓存目录可以通过命令查看python -m pip cache dir在 Linux 上通常是~/.cache/pipWindows 上是C:\Users\用户名\AppData\Local\pip\cache。PyCharm 的系统缓存目录默认在WindowsC:\Users\用户名\AppData\Local\JetBrains\PyCharm2024.2Linux~/.cache/JetBrainsmacOS~/Library/Caches/JetBrains如果这些路径恰好和项目目录在同一个分区且该分区的配额很小那么问题基本就在这里。还有一种坑如果你把 Python 解释器装在了/usr/lib/python3这种系统目录下而系统目录是只读或受限挂载pip install 时即使项目目录有空间写系统目录时也会报配额错误。此时pip install --user或许能绕开但会在 home 目录产生大量文件得看具体配额。2.3 用 pip 的 verbose 模式定位具体写入路径普通的报错被 PyCharm 控制台截断了有时候只显示最后几行。所以第一步应该加大输出详细程度pip install --verbose 你的包名如果是在安装ultralytics这类含大量原生依赖的库可以顺带加上--no-cache-dir把 pip 缓存这个干扰项排除。命令就是pip install --no-cache-dir --verbose 你的包名如果加上--no-cache-dir之后不再报Disk quota exceeded那问题几乎可以确定出在 pip 缓存目录上。3. 到底怎么解决按场景给出可直接照做的方案3.1 方案一清理 pip 缓存并修改缓存路径90% 的场景适用无论最终原因是不是缓存先做这一步成本最低而且能消除最大的干扰源。pip 的缓存文件经常是几十个 GB 的 wheel 文件堆积特别是你反复安装不同版本的 torch、paddle、tensorflow 时缓存膨胀速度非常快。清理当前缓存pip cache purge清理完成之后把 pip 缓存指向到空间充足的磁盘。Linux 下可以编辑~/.pip/pip.conf或者/etc/pip.conf[global] cache-dir /data/tmp/pipcache no-cache-dir falseWindows 下对应的是C:\Users\用户名\AppData\Roaming\pip\pip.ini[global] cache-dir D:\pipcache设置完后重启 PyCharm重新 install。此时 pip 会把下载临时文件放到你指定的大分区不再占用配额紧张的位置。我在实际操作中还会顺手清理一下旧的 wheel 缓存目录rm -rf ~/.cache/pip/wheels因为pip cache purge只会清除它自己管理的缓存目录有些旧版本 pip 会在项目目录下生成.eggs或者build目录这些不在 cache 管理范围内。3.2 方案二给 PyCharm 的系统缓存改道PyCharm 的索引、日志、插件缓存会占用不少空间而且默认路径往往就在用户的 home 下。遇到配额问题建议把 PyCharm 的系统目录改到固态硬盘或大分区。在 PyCharm 的安装目录下找到bin/idea.properties文件修改以下内容idea.system.pathD:/PyCharmData/system idea.log.pathD:/PyCharmData/log idea.config.pathD:/PyCharmData/config修改完成后重启 PyCharm它会重新建立索引。第一次启动会比较慢但之后就好了。注意修改idea.properties时不要把路径写成带空格或者中文的目录PyCharm 有些底层库对路径的兼容性不算好。3.3 方案三扩展或迁移虚拟环境到没有配额限制的分区如果你创建 Python 虚拟环境时用错了位置把它建在了/home或/data这种用户配额盘上那所有 pip install 都会写入这个环境。这时候可以新建虚拟环境并指向其他分区python -m venv /bigdata/venvs/project_env然后在 PyCharm 的Settings - Project - Python Interpreter - Add Interpreter - Existing里选择新环境里的python.exe或bin/python。迁移后原来环境里的包要重新安装一遍。如果想快速导出原环境的包列表可以先在原环境里导出source 旧环境/bin/activate pip freeze requirements.txt再在新环境里安装/bigdata/venvs/project_env/bin/pip install -r requirements.txt3.4 方案四针对 inode 耗尽问题的特别处理如果你执行df -i发现IUse%已经是 100% 或者接近 100%哪怕容量再充足也没用。需要找出目录下文件数量特别多的目录find /data -type f | wc -l但一个一个找太慢可以用下面这个命令按目录统计文件数du --inodes -S /data/* | sort -n找到文件数巨大的目录后通常是某个项目的node_modules、.git、__pycache__、build目录或者 PyCharm 的索引目录。清理掉旧的.pyc文件、__pycache__缓存能让 inode 数量立刻降下来find . -type d -name __pycache__ -exec rm -rf {} find . -type f -name *.pyc -delete如果连 inode 都被配额限制那么唯一的办法就是把这些缓存目录移到没有问题的挂载点然后做软链接。3.5 方案五Windows 用户特有的排查办法很多 Windows 用户在 PyCharm 里也遇到过OSError: [Errno 122] Disk quota exceeded但 Windows 本地磁盘默认没有配额。这时候有几个容易被忽略的点检查 OneDrive、坚果云、Dropbox 同步目录如果你的项目目录被自动同步到云盘云端可能会对本地文件设置占位配额。项目里大量小文件比如node_modules、__pycache__会被同步客户端做占位处理安装包时触发配额错误。检查 Windows 的 “此电脑 - 磁盘 - 属性 - 配额”右键磁盘属性查看配额选项是否启用。公司电脑经常会被管理员统一开配额。检查 PyCharm 是否开启了共享索引下载Settings - Appearance Behavior - System Settings - Shared Indexes默认会自动下载共享索引到缓存目录。把它改成Dont download或者把存储路径改到空间充足的地方。杀毒软件或安全软件拦截某些企业安全软件会限制单目录文件数量或写入频率表现也是Disk quota exceeded。可以在安装依赖时临时把项目目录加入白名单。我遇到过一个真实案例开发者的 D 盘有 200G 空闲但pip install paddlepaddle一直报OSError: [Errno 122]。最后发现 PyCharm 的项目解释器路径选到了一个网络映射盘Z:\venv网络盘的写权限被管理员设置了配额。把解释器换回本地 D 盘之后问题直接消失。4. 实操记录我是怎么一步步解决的为了让你看得更清楚我把这次的完整过程按时间线写出来包括中间的错误尝试方便你对照参考。4.1 复现报错与信息收集我用的环境是 LinuxPyCharm Professional 2024.2Python 3.10项目里要装ultralytics和torch。在 PyCharm 底部 Terminal 中执行pip install ultralytics没跑多久就崩了OSError: [Errno 122] Disk quota exceeded当时第一反应是查磁盘空间df -h结果显示/data分区用了 45%空闲还有 300 多 G。这就不对劲了。然后又跑df -iinode 用了 62%也没满。接着查配额quota -u sven终端提示没有 quota 命令说明系统可能没有装 quota 工具。于是我直接在报错目录下测试写入cd /data/project touch testfile echo abc testfile rm testfile这三个命令都成功了说明/data/project这个目录是可写的。那么问题可能在别的地方。4.2 怀疑 pip 缓存验证成功抱着“先排除缓存”的想法我换了命令pip install --no-cache-dir ultralytics这次竟然顺利跑完了依赖解析然后开始下载。虽然过程很慢但不再报Disk quota exceeded。这就基本锁定问题出在 pip 缓存目录。然后用python -m pip cache dir查看输出是/home/sven/.cache/pip。而/home是独立的挂载点配额很小只有 2G。继续看du -sh /home/sven/.cache/pip显示已经有 3.1G超过配额上限。所以 pip 下载完包准备写入缓存时直接把配额撑爆于是抛出了Errno 122。4.3 清理缓存 修改路径 重启 PyCharm既然原因找到了就直接按方案一处理同时把 PyCharm 的缓存也一并改道。清理 pip 缓存pip cache purge修改 pip 配置mkdir -p /data/tmp/pipcache vim ~/.pip/pip.conf写入[global] cache-dir /data/tmp/pipcache再修改 PyCharm 的bin/idea.propertiesidea.system.path/data/tmp/PyCharmSystem idea.log.path/data/tmp/PyCharmLog idea.config.path/data/tmp/PyCharmConfig保存后重启 PyCharm重新执行pip install ultralytics这次下载和安装全程稳定没有报错。安装完成后我又把旧环境里的包和缓存都确认了一遍最后还把原来的 pip 默认缓存目录整个删掉了rm -rf /home/sven/.cache/pip因为pip cache purge只删它自己管理的缓存残留目录可能还占着配额直接清空更干净。5. 常见问题速查表与避坑心得5.1 问题与解决办法对照表现象可能原因快速解决办法报Disk quota exceeded但df -h显示磁盘空间充足用户配额超限或 inode 配额超限执行df -i查看 inode再用quota或实际写入测试确认配额加--no-cache-dir后不再报错pip 缓存目录所在分区配额满pip cache purge或修改pip.conf将cache-dir指向大分区项目在本地开发但把虚拟环境建在网盘/同步盘网络盘或同步盘有配额限制将虚拟环境迁移到本地磁盘或直接新建本地虚拟环境Windows 下报错磁盘空间充足磁盘配额未识别到其实可能是同步目录占位检查 OneDrive/网盘同步、磁盘属性中的配额设置、PyCharm 共享索引报错同时还伴随着大量小文件inode 耗尽用find查找并清理__pycache__、.git、node_modules等大量小文件目录PyCharm 索引一直建立失败然后才报 quotaPyCharm 缓存目录配额不足修改idea.properties把idea.system.path等路径改到大分区5.2 我踩过的一些坑坑一把 pip 缓存改到内存盘或者 tmpfs。一开始我图快直接把cache-dir指到了/dev/shm重启后缓存全没了而且内存盘如果太小一样会报磁盘满。后来老实改到/data/tmp这种持久化目录。坑二忘了 PyCharm 的索引缓存。只改了 pip 缓存再启动 PyCharm 时还是偶尔报错。因为 PyCharm 需要重新索引项目索引文件默认写在~/.cache/JetBrains下这个目录还在配额盘上。把idea.properties里的路径改掉之后才算彻底解决。坑三在虚拟环境中执行pip cache purge不是万能的。如果 pip 版本太老它可能不支持cache purge命令。老版本用pip cache remove *也不行只能直接删目录。建议先升一下 pippython -m pip install --upgrade pip坑四Windows 下安装 PySide6 时报的可能是WinError 32而不是Errno 122。那种情况多半是文件被占用和配额无关。别混在一起排查。先确认错误号再对症下药。5.3 排查顺序建议按我现在的习惯遇到 PyCharm 控制台报Disk quota exceeded的排查顺序是看报错上下文确定是pip install阶段还是build阶段。在 PyCharm 终端里执行df -h和df -i先排除容量和 inode 问题。执行一次pip install --no-cache-dir 包名验证是否和缓存有关。查看 pip 缓存路径和大小执行pip cache purge。检查 PyCharm 的缓存目录大小必要时修改idea.properties改道。Windows 下额外检查云同步目录、解释器映射盘、磁盘配额设置。这个顺序能覆盖 80% 以上的情况而且每一步都是无损操作顶多多花几分钟不会对现有项目造成破坏。6. 一点扩展用同样的思路避免未来再踩雷排查完这次问题之后我做了一件事来防止以后再出现把开发相关的所有“临时大文件”都统一放到一个单独的数据盘目录里并且建立了清晰的目录结构/data/dev_tmp/ ├── pipcache/ ├── pycharm_system/ ├── pycharm_log/ ├── wheels/ └── venvs/然后在.bashrc或pip.conf里统一指向这些目录。这样无论哪个项目创建虚拟环境、安装依赖、还是让 PyCharm 缓存索引都不会再去碰配额紧张的 home 盘。如果是多人共用一台服务器我还建议在 PyCharm 的 Terminal 里开启pip install前先执行一遍df -h ~ df -i ~养成习惯后一旦空间吃紧马上能看到趋势不至于等到完全爆掉再手动救火。另外一个提醒PyCharm 里的 Terminal 和系统终端的环境变量不完全一样。PyCharm 的 Terminal 会加载项目虚拟环境TMPDIR可能会被重新指向到项目的.pycharm临时目录。如果你在 Terminal 里执行echo $TMPDIR发现它指向了项目目录而项目目录又在配额盘上那么 pip 解压临时文件时也会撞上配额。解决方法是手动指定export TMPDIR/data/dev_tmp/tmp安装包时再带上pip install --no-cache-dir /your/package.whl这样临时文件只写到大分区配额压力小很多。再说说 PyCharm 自带 Python Console 的问题。Python Console 的执行环境通常和我们点击“Run”按钮用的解释器一致但有时它会单独创建一些.idea缓存文件。如果 PyCharm 的workspace.xml或者索引文件异常膨胀也会挤压配额。这时可以执行rm -rf .idea重新打开项目PyCharm 会重建配置。不过这样做需要重新配置解释器介意的话可以先备份.ideacp -r .idea .idea.bak最后我想特别强调一点遇到Disk quota exceeded这类报错最好先别急着卸载 PyCharm 或者重装 Python。这个错误在设计上就是“资源配额”问题和软件本身的关系不大。只要把缓存、虚拟环境、索引目录迁移到空间充足且没有配额限制的磁盘绝大多数情况下都能自愈。我现在已经在项目里连续跑了一个多月深度学习训练每天装包、换环境、清缓存再没有出现过这个错误。希望这篇文章能帮你省下几个小时的无头排查时间。如果你按照上面的顺序走了一轮还是没解决建议重点检查一下 NFS 挂载或网络盘因为配额限制往往藏在这些你看不见的地方。
返回列表