【问题标题】:Sphinx throws KeyError exceptionSphinx 抛出 KeyError 异常
【发布时间】:2020-04-25 11:28:49
【问题描述】:

我在 docker 中有一个 python 烧瓶脚本。该脚本以这种方式从 docker-compose 获取一些环境变量:

app = Flask(__name__)
DEFAULT_PSW = os.environ['DEFAULT_PSW']

@app.route("/")
def manager():
    ...

我想用 Sphinx 记录它。我能够配置它,但是当我运行“make html”时,我得到了这个异常:

WARNING: autodoc: failed to import module 'main'; the following exception was raised:
Traceback (most recent call last):
  File "/home/lorenzo/.local/lib/python3.7/site-packages/sphinx/ext/autodoc/importer.py", line 32, in import_module
    return importlib.import_module(modname)
  File "/usr/lib/python3.7/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
  File "<frozen importlib._bootstrap>", line 983, in _find_and_load
  File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 728, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/home/lorenzo/Desktop/Dev/project/script/manager_flask/manager/manager/main.py", line 20, in <module>
    DEFAULT_PSW = os.environ['DEFAULT_PSW']
  File "/usr/lib/python3.7/os.py", line 679, in __getitem__
    raise KeyError(key) from None
KeyError: 'DEFAULT_PSW'

如果我很好地理解了 sphinx 的工作原理,问题是 sphinx 会尝试“编译”我的脚本,当然,在此过程中它不会找到环境变量。我能做什么?

编辑: 我为得到此错误所做的步骤:

  1. 创建名为 docs 的文件夹
  2. 在 docs 文件夹内启动 sphinx-quickstart,默认情况下保留除作者和项目名称之外的所有内容。
  3. 编辑了 conf.py(这个文件可以在仓库的评论中找到)
  4. 使用 sphinx-apidoc 生成第一个文件
  5. 创建文件夹模块并添加文件 scp_handler.rst 和 main.rst
  6. 更新了 index.rst,添加了新生成文件的路径
  7. 运行“制作 html”。

【问题讨论】:

  • 我不使用flask,但通常在脚本上使用Sphinx,您应该阻止__main__ 执行。 Sphinx 导入您的声明和文档字符串,因此您的模块在导入时执行一次。在这些情况下,您可以声明一些默认值来替换那些不可用的系统值。 This thread shows the general approach 类似于记录 argparse 的问题。
  • 这看起来像是您的代码中的错误?您的应用显然需要 DEFAULT_PSW 变量集,它试图告诉您它不是
  • "此脚本设计为在 docker 中运行,因此会将用于所有 ssh 连接的默认密码作为环境变量。" (sic 错别字)。在将环境变量 DEFAULT_PSW 设置为(我猜?)任何值后重试,对于您的操作系统。 (您可以在其他地方查找如何做到这一点。)
  • 我做到了,在 docker-compose 中确实定义了变量,如果我启动 docker-compose,应用程序将按预期运行。我的问题是当我运行 sphinx 命令“make html”时。当我这样做时,我得到了异常,我认为“make html”尝试编译脚本以获取文档字符串,这就是我得到错误的原因。我正在寻找一种防止这种情况的方法,或者一种运行“make html”指定参数的方法。另一种解决方案可能是删除该行,创建文档然后重写该行,但它看起来不像一个优雅的解决方案:-)
  • 你关心这个上下文中的密码吗?您可能只使用DEFAULT_PSW = os.environ.get('DEFAULT_PSW', ''),如果未设置环境变量,它不会引发关键错误,而是使用回退。

标签: python flask python-sphinx


【解决方案1】:

出于文档目的,在 conf.py 文件中设置和导出密钥:

os.environ("DEFAULT_PSW", "default_psw")

【讨论】:

    猜你喜欢
    • 2013-05-24
    • 2011-05-30
    • 1970-01-01
    • 2013-02-13
    • 2011-02-25
    • 2012-01-24
    • 1970-01-01
    相关资源
    最近更新 更多