{"record":{"id":"92e334c86a773c93","repo":"microsoft/qlib","slug":"network-path-not-found","errorCode":null,"errorMessage":"Network path not found","messagePattern":"Network path not found","errorType":"exception","errorClass":"OSError","httpStatus":null,"severity":"error","filePath":"qlib/__init__.py","lineNumber":121,"sourceCode":"    else:\n        # Judging system type\n        sys_type = platform.system()\n        if \"windows\" in sys_type.lower():\n            # system: window\n            try:\n                subprocess.run(\n                    [\"mount\", \"-o\", \"anon\", provider_uri, mount_path],\n                    capture_output=True,\n                    text=True,\n                    check=True,\n                )\n                LOG.info(\"Mount finished.\")\n            except subprocess.CalledProcessError as e:\n                error_output = (e.stdout or \"\") + (e.stderr or \"\")\n                if e.returncode == 85:\n                    LOG.warning(f\"{provider_uri} already mounted at {mount_path}\")\n                elif e.returncode == 53:\n                    raise OSError(\"Network path not found\") from e\n                elif \"error\" in error_output.lower() or \"错误\" in error_output:\n                    raise OSError(\"Invalid mount path\") from e\n                else:\n                    raise OSError(f\"Unknown mount error: {error_output.strip()}\") from e\n        else:\n            # system: linux/Unix/Mac\n            # check mount\n            _remote_uri = provider_uri[:-1] if provider_uri.endswith(\"/\") else provider_uri\n            # `mount a /b/c` is different from `mount a /b/c/`. So we convert it into string to make sure handling it accurately\n            mount_path = str(mount_path)\n            _mount_path = mount_path[:-1] if mount_path.endswith(\"/\") else mount_path\n            _check_level_num = 2\n            _is_mount = False\n            while _check_level_num:\n                with subprocess.Popen(\n                    [\"mount\"],\n                    text=True,\n                    stdout=subprocess.PIPE,","sourceCodeStart":103,"sourceCodeEnd":139,"githubUrl":"https://github.com/microsoft/qlib/blob/79633dd9506ea689e5400dea0197717b5b3d74b7/qlib/__init__.py#L103-L139","documentation":"Raised by DumpDataBase._dump_bin (scripts/dump_bin.py:284) when the file_or_data argument is neither a pandas DataFrame (with rows) nor a pathlib.Path. The method dispatches on type: DataFrames are normalized via fname_to_code on the symbol field, Paths are read through _get_source_data/get_symbol_from_file; anything else (str, list, None, numpy array, etc.) is unsupported. Note it requires pathlib.Path specifically — a plain string path will hit this branch even though it looks like a path.","triggerScenarios":"Calling dump_bin / _dump_bin with a string filename instead of Path(filename); passing a numpy structured array, dict, or list of dicts instead of a DataFrame; subclassing DumpDataBase and overriding the data source to feed an incompatible type; passing None when upstream code fails to load data.","commonSituations":"Callers building file paths with os.path.join or f-strings (which yield str) and forgetting to wrap in Path(); glue code that iterates os.listdir (str names) instead of Path.iterdir(); custom normalizers returning raw numpy arrays or tuples from a load step.","solutions":["Wrap string paths in pathlib.Path: _dump_bin(Path(file_path), calendar_list).","Convert non-DataFrame data before calling: pd.DataFrame(rows) for dicts/lists; build a proper DataFrame with symbol_field_name and date_field_name columns for numpy arrays.","If subclassing, keep the contract: override _get_source_data (Path -> DataFrame) rather than bypassing _dump_bin's expected input types."],"exampleFix":"# before\nfor name in os.listdir(data_dir):\n    dumper._dump_bin(os.path.join(data_dir, name), calendar_list)  # str -> ValueError: not support <class 'str'>\n\n# after\nfrom pathlib import Path\nfor p in Path(data_dir).iterdir():\n    if p.is_file():\n        dumper._dump_bin(p, calendar_list)","handlingStrategy":"type-guard","validationCode":"from pathlib import Path\nimport pandas as pd\nassert isinstance(file_or_data, (pd.DataFrame, Path)), f\"expected DataFrame or Path, got {type(file_or_data)}\"","typeGuard":"from pathlib import Path\nimport pandas as pd\n\ndef is_dump_input(obj) -> bool:\n    return isinstance(obj, (pd.DataFrame, Path))","tryCatchPattern":"try:\n    dumper._dump_bin(file_or_data, calendar_list)\nexcept ValueError as e:\n    if \"not support\" in str(e):\n        if isinstance(file_or_data, str):\n            dumper._dump_bin(Path(file_or_data), calendar_list)  # recover from str paths\n        else:\n            raise\n    else:\n        raise","preventionTips":["Standardize on pathlib.Path end-to-end in pipelines feeding dump_bin; avoid os.path.join/os.listdir string paths.","When subclassing DumpDataBase, honor the _dump_bin contract (DataFrame or Path) and convert custom types at the boundary."],"tags":["dump-bin","type-validation","pathlib","pandas","api-contract"],"backgroundTag":null,"analyzedSha":"79633dd9506ea689e5400dea0197717b5b3d74b7","analyzedAt":"2026-08-15T07:01:27.511Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}