Add UTF-8 encoding support for Windows in simulation_runner.py and run_parallel_simulation.py to resolve character encoding issues with third-party libraries.
This commit is contained in:
parent
f46c1a9ec7
commit
067855f7b5
2 changed files with 47 additions and 2 deletions
|
|
@ -423,6 +423,12 @@ class SimulationRunner:
|
||||||
main_log_path = os.path.join(sim_dir, "simulation.log")
|
main_log_path = os.path.join(sim_dir, "simulation.log")
|
||||||
main_log_file = open(main_log_path, 'w', encoding='utf-8')
|
main_log_file = open(main_log_path, 'w', encoding='utf-8')
|
||||||
|
|
||||||
|
# 设置子进程环境变量,确保 Windows 上使用 UTF-8 编码
|
||||||
|
# 这可以修复第三方库(如 OASIS)读取文件时未指定编码的问题
|
||||||
|
env = os.environ.copy()
|
||||||
|
env['PYTHONUTF8'] = '1' # Python 3.7+ 支持,让所有 open() 默认使用 UTF-8
|
||||||
|
env['PYTHONIOENCODING'] = 'utf-8' # 确保 stdout/stderr 使用 UTF-8
|
||||||
|
|
||||||
# 设置工作目录为模拟目录(数据库等文件会生成在此)
|
# 设置工作目录为模拟目录(数据库等文件会生成在此)
|
||||||
# 使用 start_new_session=True 创建新的进程组,确保可以通过 os.killpg 终止所有子进程
|
# 使用 start_new_session=True 创建新的进程组,确保可以通过 os.killpg 终止所有子进程
|
||||||
process = subprocess.Popen(
|
process = subprocess.Popen(
|
||||||
|
|
@ -431,7 +437,9 @@ class SimulationRunner:
|
||||||
stdout=main_log_file,
|
stdout=main_log_file,
|
||||||
stderr=subprocess.STDOUT, # stderr 也写入同一个文件
|
stderr=subprocess.STDOUT, # stderr 也写入同一个文件
|
||||||
text=True,
|
text=True,
|
||||||
|
encoding='utf-8', # 显式指定编码
|
||||||
bufsize=1,
|
bufsize=1,
|
||||||
|
env=env, # 传递带有 UTF-8 设置的环境变量
|
||||||
start_new_session=True, # 创建新进程组,确保服务器关闭时能终止所有相关进程
|
start_new_session=True, # 创建新进程组,确保服务器关闭时能终止所有相关进程
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -25,16 +25,53 @@ OASIS 双平台并行模拟预设脚本
|
||||||
└── run_state.json # 运行状态(API 查询用)
|
└── run_state.json # 运行状态(API 查询用)
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
# ============================================================
|
||||||
|
# 解决 Windows 编码问题:在所有 import 之前设置 UTF-8 编码
|
||||||
|
# 这是为了修复 OASIS 第三方库读取文件时未指定编码的问题
|
||||||
|
# ============================================================
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
|
||||||
|
if sys.platform == 'win32':
|
||||||
|
# 设置 Python 默认 I/O 编码为 UTF-8
|
||||||
|
# 这会影响所有未指定编码的 open() 调用
|
||||||
|
os.environ.setdefault('PYTHONUTF8', '1')
|
||||||
|
os.environ.setdefault('PYTHONIOENCODING', 'utf-8')
|
||||||
|
|
||||||
|
# 重新配置标准输出流为 UTF-8(解决控制台中文乱码)
|
||||||
|
if hasattr(sys.stdout, 'reconfigure'):
|
||||||
|
sys.stdout.reconfigure(encoding='utf-8', errors='replace')
|
||||||
|
if hasattr(sys.stderr, 'reconfigure'):
|
||||||
|
sys.stderr.reconfigure(encoding='utf-8', errors='replace')
|
||||||
|
|
||||||
|
# 强制设置默认编码(影响 open() 函数的默认编码)
|
||||||
|
# 注意:这需要在 Python 启动时就设置,运行时设置可能不生效
|
||||||
|
# 所以我们还需要 monkey-patch 内置的 open 函数
|
||||||
|
import builtins
|
||||||
|
_original_open = builtins.open
|
||||||
|
|
||||||
|
def _utf8_open(file, mode='r', buffering=-1, encoding=None, errors=None,
|
||||||
|
newline=None, closefd=True, opener=None):
|
||||||
|
"""
|
||||||
|
包装 open() 函数,对于文本模式默认使用 UTF-8 编码
|
||||||
|
这可以修复第三方库(如 OASIS)读取文件时未指定编码的问题
|
||||||
|
"""
|
||||||
|
# 只对文本模式(非二进制)且未指定编码的情况设置默认编码
|
||||||
|
if encoding is None and 'b' not in mode:
|
||||||
|
encoding = 'utf-8'
|
||||||
|
return _original_open(file, mode, buffering, encoding, errors,
|
||||||
|
newline, closefd, opener)
|
||||||
|
|
||||||
|
builtins.open = _utf8_open
|
||||||
|
|
||||||
import argparse
|
import argparse
|
||||||
import asyncio
|
import asyncio
|
||||||
import json
|
import json
|
||||||
import logging
|
import logging
|
||||||
import multiprocessing
|
import multiprocessing
|
||||||
import os
|
|
||||||
import random
|
import random
|
||||||
import signal
|
import signal
|
||||||
import sqlite3
|
import sqlite3
|
||||||
import sys
|
|
||||||
import warnings
|
import warnings
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from typing import Dict, Any, List, Optional, Tuple
|
from typing import Dict, Any, List, Optional, Tuple
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue