|
33 | 33 | format_env_line, |
34 | 34 | load_app_dotenv, |
35 | 35 | read_dotenv_file, |
| 36 | + remove_invalid_dotenv_lines, |
36 | 37 | validate_env_key, |
37 | 38 | ) |
38 | 39 | from manga_translator.utils.openai_compat import resolve_openai_compatible_api_key |
@@ -159,6 +160,8 @@ def __init__(self, root_dir: str): |
159 | 160 | else: |
160 | 161 | self.env_path = os.path.join(self.root_dir, ".env") |
161 | 162 | os.environ[APP_DOTENV_PATH_ENV] = self.env_path |
| 163 | + self._deferred_write_error: Optional[str] = None |
| 164 | + self._remove_invalid_env_lines() |
162 | 165 | try: |
163 | 166 | self._env_values = read_dotenv_file(self.env_path) |
164 | 167 | load_app_dotenv(self.env_path, override=True) |
@@ -201,6 +204,22 @@ def __init__(self, root_dir: str): |
201 | 204 | self._config_cache = None |
202 | 205 | self._initialize_write_pipeline() |
203 | 206 |
|
| 207 | + def _remove_invalid_env_lines(self) -> None: |
| 208 | + try: |
| 209 | + removed = remove_invalid_dotenv_lines(self.env_path) |
| 210 | + except Exception as exc: |
| 211 | + self._deferred_write_error = f"{self.env_path}: {exc}" |
| 212 | + self.logger.error(f"清理 .env 解析错误行失败: {exc}") |
| 213 | + return |
| 214 | + if removed: |
| 215 | + self.logger.warning(f"已删除 .env 中 {removed} 行无法解析的配置") |
| 216 | + |
| 217 | + def take_deferred_write_error(self) -> Optional[str]: |
| 218 | + error = self._deferred_write_error |
| 219 | + self._deferred_write_error = None |
| 220 | + return error |
| 221 | + |
| 222 | + |
204 | 223 | def _initialize_write_pipeline(self) -> None: |
205 | 224 | self._write_lock = threading.RLock() |
206 | 225 | self._pending_config_writes: Dict[str, Dict[str, Any]] = {} |
@@ -654,7 +673,7 @@ def on_done(done_future: Future) -> None: |
654 | 673 | message, |
655 | 674 | exc_info=(type(error), error, error.__traceback__), |
656 | 675 | ) |
657 | | - self.write_failed.emit(message) |
| 676 | + self.write_failed.emit(str(error)) |
658 | 677 |
|
659 | 678 | future.add_done_callback(on_done) |
660 | 679 | return future |
@@ -704,6 +723,7 @@ def reload_config(self): |
704 | 723 | """ |
705 | 724 | self.logger.info("正在强制重新加载配置...") |
706 | 725 | self.flush_pending_writes() |
| 726 | + self._remove_invalid_env_lines() |
707 | 727 |
|
708 | 728 | # 1. 重新加载 .env 文件到 os.environ。翻译引擎会自动从此读取。 |
709 | 729 | load_app_dotenv(self.env_path, override=True) |
|
0 commit comments