使用subprocess.getstatusoutput执行命令丢失斯洛文尼亚语特殊字符
解决subprocess.getstatusoutput调用bash脚本时特殊字符乱码问题
问题根源
Python 3.8的subprocess.getstatusoutput在非交互式场景调用子进程时,会继承不完整的locale环境变量,导致终端默认的UTF-8编码未被正确应用,斯洛文尼亚语特殊字符(如ž)因此被替换为?。而直接在终端执行脚本时,你的shell环境已配置了正确的UTF-8 locale,所以显示正常。
可行解决方案
1. 改用subprocess.run并显式指定编码
放弃使用getstatusoutput,直接用subprocess.run并指定encoding='utf-8',确保以UTF-8编码读取输出:
import subprocess # 替换为你的脚本路径 result = subprocess.run( ['/path/to/your/script.sh'], capture_output=True, encoding='utf-8', check=False ) exit_code = result.returncode output = result.stdout print(output)
2. 给getstatusoutput传递正确的locale环境变量
如果必须使用getstatusoutput,复制当前环境变量并设置斯洛文尼亚语UTF-8 locale后传入:
import subprocess import os env = os.environ.copy() env['LC_ALL'] = 'sl_SI.UTF-8' env['LANG'] = 'sl_SI.UTF-8' status, output = subprocess.getstatusoutput( ['/path/to/your/script.sh'], env=env ) print(output)
注意:先通过locale -a命令检查系统是否已安装sl_SI.UTF-8 locale,若未安装,执行sudo locale-gen sl_SI.UTF-8生成。
3. 在bash脚本中强制设置编码
在脚本开头添加环境变量设置,让脚本自身强制输出UTF-8编码内容:
export LC_ALL=sl_SI.UTF-8 export LANG=sl_SI.UTF-8 # 脚本原有内容示例 echo "država"
内容的提问来源于stack exchange,提问作者MKK
相关产品推荐
相关产品推荐

