Conda环境下进度条显示异常是什么原因导致的?
问题成因
这个问题是Conda环境和系统终端的交互配置不匹配导致的,核心原因有3类:
- Locale配置异常:Conda创建非base环境时默认不会完全继承系统的locale配置,会 fallback 到不支持UTF-8的
C/POSIXlocale。这会直接导致Unicode字符显示乱码,同时终端窗口宽度检测逻辑失效,进度条无法正确计算当前行可容纳的长度,超出预设宽度就会自动换行,最终出现进度条拆分多行、向上偏移覆盖历史输出的问题。 - 终端控制依赖包不兼容:进度条工具依赖
readline、curses这类终端交互库实现光标回退、行覆盖等效果,如果Conda环境内安装的readline等包版本和系统终端的控制协议不兼容,就会把进度条用来覆盖当前行的\r控制符识别为换行符,导致每更新一次进度条就新增一行,甚至出现光标位置偏移覆盖历史输出的问题。 - Python输出流编码被篡改:部分旧版Conda创建Python 3.8环境时会强制设置
PYTHONIOENCODING为非UTF-8值,导致Python输出流的编码不匹配终端配置,既会出现Unicode字符乱码,也会导致控制字符输出异常。
修复方案
按照优先级依次尝试以下操作即可解决:
- 修复Locale配置
在异常的Conda环境中执行如下命令,永久设置环境内的locale为系统匹配的UTF-8编码:
conda env config vars set LC_ALL=zh_CN.UTF-8 LANG=zh_CN.UTF-8
如果是英文系统,将zh_CN.UTF-8替换为en_US.UTF-8即可,设置完成后执行conda deactivate再重新激活环境生效。
2. 修复Python输出流编码
如果第一步完成后Unicode乱码还存在,执行如下命令设置Python输出流默认编码为UTF-8:
conda env config vars set PYTHONIOENCODING=utf-8
同样重新激活环境生效。
3. 重装终端交互依赖包
如果进度条显示异常还存在,重装环境内的终端交互和进度条依赖:
conda install --reinstall readline tqdm
如果进度条工具是通过pip安装的,替换为:
pip uninstall -y readline tqdm && pip install readline tqdm
- 关闭Conda提示符修改(可选)
如果上述操作都无效,可能是Conda激活时修改命令提示符导致终端参数检测异常,执行如下命令关闭该功能即可:
conda config --set changeps1 False
内容的提问来源于stack exchange,提问作者Hieu Nguyen
相关产品推荐
相关产品推荐

