{"record":{"id":"43d003ac81fca646","repo":"binary-husky/gpt_academic","slug":"env-var-arg","errorCode":null,"errorMessage":"[ENV_VAR] 环境变量{arg}加载失败! ","messagePattern":"\\[ENV_VAR\\] 环境变量(.+?)加载失败! ","errorType":"exception","errorClass":"KeyError","httpStatus":null,"severity":"error","filePath":"shared_utils/config_loader.py","lineNumber":58,"sourceCode":"        elif isinstance(default_value, int):\n            r = int(env_arg)\n        elif isinstance(default_value, float):\n            r = float(env_arg)\n        elif isinstance(default_value, str):\n            r = env_arg.strip()\n        elif isinstance(default_value, dict):\n            r = eval(env_arg)\n        elif isinstance(default_value, list):\n            r = eval(env_arg)\n        elif default_value is None:\n            assert arg == \"proxies\"\n            r = eval(env_arg)\n        else:\n            log亮红(f\"[ENV_VAR] 环境变量{arg}不支持通过环境变量设置! \")\n            raise KeyError\n    except:\n        log亮红(f\"[ENV_VAR] 环境变量{arg}加载失败! \")\n        raise KeyError(f\"[ENV_VAR] 环境变量{arg}加载失败! \")\n\n    log亮绿(f\"[ENV_VAR] 成功读取环境变量{arg}\")\n    return r\n\n\n@lru_cache(maxsize=128)\ndef read_single_conf_with_lru_cache(arg):\n    from shared_utils.key_pattern_manager import is_any_api_key\n    try:\n        # 优先级1. 获取环境变量作为配置\n        default_ref = getattr(importlib.import_module('config'), arg) # 读取默认值作为数据类型转换的参考\n        r = read_env_variable(arg, default_ref)\n    except:\n        try:\n            # 优先级2. 获取config_private中的配置\n            r = getattr(importlib.import_module('config_private'), arg)\n        except:\n            # 优先级3. 获取config中的配置","sourceCodeStart":40,"sourceCodeEnd":76,"githubUrl":"https://github.com/binary-husky/gpt_academic/blob/d6bde0fa54373309bd05823a49bda8da019d2c77/shared_utils/config_loader.py#L40-L76","documentation":"shared_utils/config_loader.read_env_variable converts an environment variable to the type of the config default (str/int/bool/dict/list via eval); the whole body is wrapped in try/except that, on any failure — unsupported type, eval syntax error, int('abc') — logs '[ENV_VAR] 环境变量{arg}加载失败!' and raises KeyError. The bare except hides the actual conversion error.","triggerScenarios":"Setting an environment variable for a config entry whose default is a dict/list and passing invalid Python literal syntax; a non-numeric string for an int default; a bad bool literal; or the env value being eval'd failing for any other reason during startup.","commonSituations":"Docker/k8s deployments passing config via env vars with JSON instead of Python-literal syntax (quotes/brackets mismatched); env var containing shell-expanded characters that break eval; typos like DEFAULT='none' for bool configs.","solutions":["Fix the env var value to be a valid Python literal of the same type as the config default (dict/list use Python literal syntax, not JSON, e.g. \"{'k': 'v'}\").","Check the log亮红 line above the raise to identify which env var (arg) failed.","Remove the env var and set the value directly in config.py instead.","For bools use True/False, for ints plain digits, matching Python semantics."],"exampleFix":"# before\nexport GPT_SOVITS_URL='{\"url\": \"x\"}'   # JSON braces -> eval fails\n\n# after\nexport GPT_SOVITS_URL=\"'http://127.0.0.1:9880/'\"  # valid Python literal","handlingStrategy":"validation","validationCode":"import os, ast\ndef env_literal_ok(name: str, default) -> bool:\n    v = os.environ.get(name)\n    if v is None:\n        return True\n    try:\n        if isinstance(default, (dict, list)) or default is None:\n            ast.literal_eval(v)\n        elif isinstance(default, bool):\n            assert v in ('True', 'False')\n        elif isinstance(default, int):\n            int(v)\n        return True\n    except Exception:\n        return False\n\nif not env_literal_ok('MY_SETTING', default_ref):\n    raise ConfigError('env var MY_SETTING is not a valid literal for its type')","typeGuard":null,"tryCatchPattern":"try:\n    val = read_single_conf_with_lru_cache('MY_SETTING')\nexcept KeyError as e:\n    if '环境变量' in str(e):\n        show_env_syntax_help(arg='MY_SETTING')  # needs Python literal, not JSON","preventionTips":["Use Python literal syntax for dict/list env vars, JSON will fail eval.","Prefer setting complex values in config.py; env vars for scalars only.","Test env-based config in a scratch shell before deploying."],"tags":["configuration","environment-variables","eval","startup"],"backgroundTag":null,"analyzedSha":"d6bde0fa54373309bd05823a49bda8da019d2c77","analyzedAt":"2026-08-14T22:48:35.038Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}