diff --git a/dpdata/system.py b/dpdata/system.py index 18b16aaf..36a01111 100644 --- a/dpdata/system.py +++ b/dpdata/system.py @@ -480,7 +480,10 @@ def append(self, system: System) -> bool: return False elif not len(self.data["atom_numbs"]): # this system is non-converged but the system to append is converged - self.data = system.data.copy() + # A shallow dict copy would still alias all arrays and lists in + # ``system.data``. The first append must have the same ownership + # semantics as subsequent append operations. + self.data = deepcopy(system.data) return False if system.uniq_formula != self.uniq_formula: raise RuntimeError( @@ -1492,8 +1495,10 @@ def from_dir( type_map: list[str] | None = None, ): multi_systems = cls() + # Do not prepend ``./``: doing so turns an absolute directory into a + # relative pattern and silently yields no matches. target_file_list = sorted( - glob.glob(f"./{dir_name}/**/{file_name}", recursive=True) + glob.glob(os.path.join(dir_name, "**", file_name), recursive=True) ) for target_file in target_file_list: multi_systems.append( diff --git a/tests/test_multisystems.py b/tests/test_multisystems.py index fd9b278d..7c363c2a 100644 --- a/tests/test_multisystems.py +++ b/tests/test_multisystems.py @@ -51,6 +51,19 @@ def test_str(self): ) +class TestMultiSystemsFromDir(unittest.TestCase): + def test_absolute_directory_matches_relative_directory(self): + relative = dpdata.MultiSystems.from_dir( + "poscars", "OUTCAR.h2o.md", fmt="vasp/outcar" + ) + absolute = dpdata.MultiSystems.from_dir( + os.path.abspath("poscars"), "OUTCAR.h2o.md", fmt="vasp/outcar" + ) + self.assertEqual(len(relative), 1) + self.assertEqual(len(absolute), len(relative)) + self.assertEqual(absolute.get_nframes(), relative.get_nframes()) + + class TestMultiSystemsAdd(unittest.TestCase, CompLabeledSys, MultiSystems, IsNoPBC): def setUp(self): self.places = 6