{"record":{"id":"e3b85f0b6da239d0","repo":"microsoft/qlib","slug":"login-respond-error-msg-lg-error-msg","errorCode":null,"errorMessage":"login respond error_msg: {lg.error_msg}","messagePattern":"login respond error_msg: (.+?)","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"scripts/data_collector/future_calendar_collector.py","lineNumber":74,"sourceCode":"        calendars_list = [self._format_datetime(x) for x in sorted(set(self.calendar_list + calendar))]\n        np.savetxt(self.future_path, calendars_list, fmt=\"%s\", encoding=\"utf-8\")\n\n    @abc.abstractmethod\n    def collector(self) -> Iterable[pd.Timestamp]:\n        \"\"\"\n\n        Returns\n        -------\n\n        \"\"\"\n        raise NotImplementedError(f\"Please implement the `collector` method\")\n\n\nclass CollectorFutureCalendarCN(CollectorFutureCalendar):\n    def collector(self) -> Iterable[pd.Timestamp]:\n        lg = bs.login()\n        if lg.error_code != \"0\":\n            raise ValueError(f\"login respond error_msg: {lg.error_msg}\")\n        rs = bs.query_trade_dates(\n            start_date=self._format_datetime(self.start_date), end_date=self._format_datetime(self.end_date)\n        )\n        if rs.error_code != \"0\":\n            raise ValueError(f\"query_trade_dates respond error_msg: {rs.error_msg}\")\n        data_list = []\n        while (rs.error_code == \"0\") & rs.next():\n            data_list.append(rs.get_row_data())\n        calendar = pd.DataFrame(data_list, columns=rs.fields)\n        calendar[\"is_trading_day\"] = calendar[\"is_trading_day\"].astype(int)\n        return pd.to_datetime(calendar[calendar[\"is_trading_day\"] == 1][\"calendar_date\"]).to_list()\n\n\nclass CollectorFutureCalendarUS(CollectorFutureCalendar):\n    def collector(self) -> Iterable[pd.Timestamp]:\n        # TODO: US future calendar\n        raise ValueError(\"Us calendar is not supported\")\n","sourceCodeStart":56,"sourceCodeEnd":92,"githubUrl":"https://github.com/microsoft/qlib/blob/79633dd9506ea689e5400dea0197717b5b3d74b7/scripts/data_collector/future_calendar_collector.py#L56-L92","documentation":"Raised by CollectorFutureCalendarCN.collector (scripts/data_collector/future_calendar_collector.py:74) when baostock's bs.login() returns a non-'0' error_code. Baostock is the free CN market-data API used to fetch trade dates; login failures mean the session to the baostock service could not be established before query_trade_dates is attempted.","triggerScenarios":"Calling CollectorFutureCalendarCN(...).collector() when bs.login() fails: network outage/blocking of baostock servers, baostock service maintenance, or an incompatible/old baostock package version whose login handshake fails.","commonSituations":"Corporate networks or Docker containers without outbound access to baostock; baostock weekend maintenance windows; pip-installed baostock version drift after upgrading the environment.","solutions":["Test connectivity/login in isolation: `python -c \"import baostock as bs; print(bs.login().error_code)\"` — if non-zero, fix network/egress first.","Upgrade/reinstall the baostock package (pip install -U baostock) to rule out protocol drift.","Retry the collection later if baostock is under maintenance (check baostock status pages/forums)."],"exampleFix":"# before\nlg = bs.login()\nif lg.error_code != '0':\n    raise ValueError(f\"login respond error_msg: {lg.error_msg}\")\n\n# after (caller-side guard with retry)\nimport baostock as bs, time\nfor attempt in range(3):\n    lg = bs.login()\n    if lg.error_code == '0':\n        break\n    time.sleep(5 * (attempt + 1))\nelse:\n    raise RuntimeError(f\"baostock login failed: {lg.error_msg}\")","handlingStrategy":"retry","validationCode":"import baostock as bs\nlg = bs.login()\nif lg.error_code != '0':\n    raise SystemExit(f'baostock unreachable: {lg.error_msg}')","typeGuard":null,"tryCatchPattern":"for attempt in range(3):\n    try:\n        calendar = collector.collector()\n        break\n    except ValueError as e:\n        if 'login respond' in str(e) and attempt < 2:\n            time.sleep(30); bs.logout(); continue\n        raise","preventionTips":["Pre-flight bs.login() in scripts that need baostock before starting long jobs.","Run collection from networks with outbound access to baostock servers."],"tags":["baostock","network","authentication","cn-calendar"],"backgroundTag":null,"analyzedSha":"79633dd9506ea689e5400dea0197717b5b3d74b7","analyzedAt":"2026-08-15T07:01:27.511Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}