From bc6c0b00584fcb7a0dd7126a72bfd8a837cc32e6 Mon Sep 17 00:00:00 2001 From: youmi <2508645198@qq.com> Date: Wed, 15 Jul 2026 13:03:55 +0800 Subject: [PATCH] Fix compatibility check import side effects --- office/compatibility.py | 26 ++++++++++++------------ tests/test_code/test_optional_imports.py | 9 ++++++++ 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/office/compatibility.py b/office/compatibility.py index 1a0c6ba..c7375a6 100644 --- a/office/compatibility.py +++ b/office/compatibility.py @@ -27,14 +27,18 @@ def _check_first_run(self) -> bool: Returns: bool: 如果是首次运行返回True,否则返回False """ - # 创建标记目录 - self.mark_file.parent.mkdir(exist_ok=True) - - # 如果标记文件不存在,则是首次运行 - if not self.mark_file.exists(): - # 创建标记文件 - self.mark_file.write_text(f"First run on {platform.system()} at {platform.platform()}") - return True + try: + # 创建标记目录 + self.mark_file.parent.mkdir(exist_ok=True) + + # 如果标记文件不存在,则是首次运行 + if not self.mark_file.exists(): + # 创建标记文件 + self.mark_file.write_text(f"First run on {platform.system()} at {platform.platform()}") + return True + except OSError: + # 兼容性提示不应影响主包导入;HOME 只读或不可写时跳过首次运行提示。 + return False return False def get_compatibility_info(self) -> Dict[str, List[str]]: @@ -235,10 +239,6 @@ def check_compatibility(): return checker -# 在模块导入时自动检查兼容性 -compatibility_checker = check_compatibility() - - if __name__ == "__main__": # 测试代码 checker = CrossPlatformCompatibility() @@ -247,4 +247,4 @@ def check_compatibility(): print(f"标记文件: {checker.mark_file}") # 显示警告(仅在非Windows且首次运行时) - checker.display_warning() \ No newline at end of file + checker.display_warning() diff --git a/tests/test_code/test_optional_imports.py b/tests/test_code/test_optional_imports.py index 227863e..485e3b1 100644 --- a/tests/test_code/test_optional_imports.py +++ b/tests/test_code/test_optional_imports.py @@ -123,6 +123,15 @@ def test_import_office_without_windows_only_dependencies(self): with self._optional_import_test_environment(): importlib.import_module("office") + def test_compatibility_check_does_not_fail_when_mark_file_cannot_be_written(self): + with self._optional_import_test_environment(): + compatibility = importlib.import_module("office.compatibility") + + with mock.patch.object(compatibility.Path, "mkdir", side_effect=PermissionError("readonly")): + checker = compatibility.CrossPlatformCompatibility() + + self.assertFalse(checker.is_first_run) + def test_loader_preserves_dependency_internal_import_errors(self): with self._optional_import_test_environment(): importlib.import_module("office")