59 lines
1.8 KiB
Python
59 lines
1.8 KiB
Python
|
|
#!/usr/bin/env python3
|
|||
|
|
"""视频AI系统 · 统一密钥加载器
|
|||
|
|
所有工具脚本通过本模块获取密钥,不各自散落读取逻辑。
|
|||
|
|
|
|||
|
|
用法:
|
|||
|
|
from tools.secrets_loader import secrets
|
|||
|
|
key = secrets["JIMENG_API_KEY"]
|
|||
|
|
|
|||
|
|
密钥来源: video-ai-system/LOCAL-SECRETS-PATH.hdlp
|
|||
|
|
读取顺序: 本地secrets文件 → 仓库.env → 环境变量 → 空值不覆盖
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
import os
|
|||
|
|
|
|||
|
|
# 密钥文件路径(按优先级)
|
|||
|
|
_SECRET_FILES = [
|
|||
|
|
"/Users/bingshuolingdianyuanhe/Documents/guanghulab-local-secrets/video-ai-system.env",
|
|||
|
|
os.path.expanduser("~/guanghulab/video-ai-system/.env"),
|
|||
|
|
]
|
|||
|
|
|
|||
|
|
def _load():
|
|||
|
|
"""加载所有密钥到 dict,高优先级文件的同名 key 不被低优先级覆盖"""
|
|||
|
|
result = {}
|
|||
|
|
|
|||
|
|
# 先从低优先级加载
|
|||
|
|
for path in reversed(_SECRET_FILES):
|
|||
|
|
if os.path.exists(path):
|
|||
|
|
with open(path) as f:
|
|||
|
|
for line in f:
|
|||
|
|
line = line.strip()
|
|||
|
|
if not line or line.startswith("#") or "=" not in line:
|
|||
|
|
continue
|
|||
|
|
k, v = line.split("=", 1)
|
|||
|
|
k, v = k.strip(), v.strip()
|
|||
|
|
if k not in result:
|
|||
|
|
result[k] = v
|
|||
|
|
|
|||
|
|
# 最后加载环境变量(最高优先级)
|
|||
|
|
for key in list(result.keys()):
|
|||
|
|
env_val = os.environ.get(key)
|
|||
|
|
if env_val:
|
|||
|
|
result[key] = env_val
|
|||
|
|
|
|||
|
|
return result
|
|||
|
|
|
|||
|
|
secrets = _load()
|
|||
|
|
|
|||
|
|
# 快速访问
|
|||
|
|
def get(key, default=None):
|
|||
|
|
return secrets.get(key, default)
|
|||
|
|
|
|||
|
|
if __name__ == "__main__":
|
|||
|
|
# 诊断模式:列出所有已加载的密钥变量名(不显示值)
|
|||
|
|
print("=== 已加载密钥变量 ===")
|
|||
|
|
for k in sorted(secrets.keys()):
|
|||
|
|
v = secrets[k]
|
|||
|
|
masked = v[:8] + "..." + v[-4:] if len(v) > 12 else "***"
|
|||
|
|
print(f" {k} = {masked}")
|