Django脚本调用call_command执行dumpdata出现charmap编码错误如何解决
错误原因
你在命令行执行导出命令时添加的-Xutf8参数会强制Python解释器使用UTF-8作为默认IO编码,而脚本运行时当前Python进程默认使用系统编码(Windows环境下为charmap/gbk),遇到中文字符等非ASCII内容时无法编码写入文件,因此触发报错。
解决方案
方案1:手动指定输出文件编码(兼容性最高,推荐)
不使用call_command内置的output参数,自行创建UTF-8编码的文件流传入stdout,不受系统默认编码影响:import os from django.core import management # 构造目标文件路径 dump_file_path = os.path.join(path, "app/fixtures/data.json") # 手动打开文件,指定UTF-8编码 with open(dump_file_path, "w", encoding="utf-8") as f: management.call_command( "dumpdata", "app.ModelName", # 注意补上你需要导出的模型,和命令行参数一致 indent=4, format="json", stdout=f, verbosity=1, )方案2:脚本开头强制设置IO编码
在导入Django相关模块前,配置Python IO编码环境变量:import os # 强制设置Python IO编码为UTF-8,需放在导入django、management等模块前 os.environ["PYTHONIOENCODING"] = "utf-8" from django.core import management # 后续你的原有call_command代码无需修改方案3:执行脚本时添加编码参数
运行你的脚本时和执行dumpdata命令一样传入-Xutf8参数即可,原有代码无需修改:py -Xutf8 你的脚本文件名.py
补充注意
你当前的call_command代码中遗漏了命令行里指定的app.ModelName参数,如果只需要导出指定模型的数据记得补上,否则会默认导出整个数据库的所有数据。另外路径中不需要手动写双斜杠,os.path.join会自动适配不同系统的路径分隔符。
内容的提问来源于stack exchange,提问作者superflyer11
相关产品推荐
相关产品推荐

