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:
666ghj 2025-12-26 18:14:57 +08:00
parent f46c1a9ec7
commit 067855f7b5
2 changed files with 47 additions and 2 deletions

View file

@ -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, # 创建新进程组,确保服务器关闭时能终止所有相关进程
) )

View file

@ -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