diff --git a/Tools/ModelTranslator/rizom_unwrap.py b/Tools/ModelTranslator/rizom_unwrap.py index 48718dd7..d3a2b3bb 100644 --- a/Tools/ModelTranslator/rizom_unwrap.py +++ b/Tools/ModelTranslator/rizom_unwrap.py @@ -33,8 +33,10 @@ def registry_rizom_path(): continue key_path = "SOFTWARE\\Rizom Lab\\RizomUV VS RS 202%d.%d" % (i, j) try: - key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, key_path) - return winreg.QueryValue(key, "rizomuv.exe") + with winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, key_path) as key: + val = winreg.QueryValue(key, "rizomuv.exe") + # 注册表值是不带后缀的安装前缀(官方只取 dirname 用),拼回真实 exe + return os.path.join(os.path.dirname(val), "rizomuv.exe") except OSError: continue return None diff --git a/Tools/ModelTranslator/tests/test_rizom_unwrap.py b/Tools/ModelTranslator/tests/test_rizom_unwrap.py index aa74dc89..3b2e2096 100644 --- a/Tools/ModelTranslator/tests/test_rizom_unwrap.py +++ b/Tools/ModelTranslator/tests/test_rizom_unwrap.py @@ -1,6 +1,7 @@ import os import sys import unittest +from unittest import mock sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) import rizom_unwrap as ru @@ -21,10 +22,17 @@ class TestCandidatePaths(unittest.TestCase): class TestFindRizomuv(unittest.TestCase): def test_missing_exe_raises(self): - os.environ.pop("RIZOMUV_EXE", None) - with self.assertRaises(ru.RizomError): - ru.find_rizomuv("Z:/no/such/rizomuv.exe", use_registry=False, - default="Z:/no/default.exe") + with mock.patch.dict(os.environ): + os.environ.pop("RIZOMUV_EXE", None) + with self.assertRaises(ru.RizomError): + ru.find_rizomuv("Z:/no/such/rizomuv.exe", use_registry=False, + default="Z:/no/default.exe") + + def test_registry_value_is_real_exe_if_present(self): + p = ru.registry_rizom_path() + if p is None: + self.skipTest("本机无 RizomUV 注册表项") + self.assertTrue(os.path.isfile(p), "注册表返回值应是真实 exe:%s" % p) if __name__ == "__main__":