Sphinx-找不到文件-sys.path问题



我正试图为我的烧瓶项目构建文档,但我遇到了路径的问题

我的项目结构如下:

myproject
    config
        all.py
        __init__.py
        logger.py
        logger.conf
    myproject
        models.py
        __init__.py
    en (english language docs folder)
        conf.py

logger.py包含一行

with open('logger.conf') as f: CONFIG = ast.literal_eval(f.read())

从logger.conf 读取配置

而"制作html"

根据型号,我收到许多错误:

/home/username/projects/fb/myproject/en/models/index.rst:7: WARNING: autodoc: failed to import class u'User' from module u'myproject.models'; the following exception was raised:
Traceback (most recent call last):
  File "/usr/lib/python2.7/site-packages/sphinx/ext/autodoc.py", line 326, in import_object
__import__(self.modname)
  File "/home/username/projects/fb/myproject/myproject/__init__.py", line 14, in <module>
from logger import flask_debug
  File "/home/username/projects/fb/myproject/logger.py", line 5, in <module>
with open('logger.conf') as f: CONFIG = ast.literal_eval(f.read())
IOError: [Errno 2] No such file or directory: 'logger.conf'

这很奇怪,因为conf.py包括以下路径:sys.path.insert(0,'/home/username/projects/fb/myproject/')

当我打印sys.path时,它显示路径在那里。

当我将FULL PATH粘贴到logger.py中的logger.conf文件时,它会转到与之相似的另一行,并为不同的文件抛出相同的错误。

为什么Sphinx不检查相对于sys.path的路径文件?

因为它不适用于"./file"或"file"。它开始只对"../file"有效——当我更改了所有路径时,但"破坏"了python的工作,因为python的路径被破坏了。

问题出在open()的行为上。像open()chdir()这样的命令在您现在所在的目录中工作,该目录可能是makefile所在的目录。

要测试它,请在对open('logger.conf')的调用上方添加一个print(os.listdir('.'),这将显示问题。

解决方案?使用绝对路径。所以,有点冗长,像这样:

import os
this_directory = os.path.dirname(__file__)
# __file__ is the absolute path to the current python file.
open(os.path.join(this_directory, 'logger.conf'))

如果你把它变成了一个python包(="它有一个setup.py"),那么你可以获得额外的积分,在这种情况下,你可以:;

import pkg_resources
open(pkg_resources.resource_filename('myproject.config', 'logger.conf'))

我在为一些python代码生成sphinx文档时遇到了类似的问题,这些代码不是为了在我的计算机中运行而编写的,而是在嵌入式系统中运行的。在这种情况下,现有的代码试图打开一个我的计算机中不存在的文件,这导致sphinx失败。在这种情况下,我决定首先更改代码以验证文件的存在,这使得sphinx可以毫无问题地传递此逻辑。

if os.path.isfile(filename):
    # open file here
else:
    # handle error in a way that doesn't make sphinx crash
    print "ERROR: No such file: '%s'" % filename

有一段时间,我试着嘲笑open(),但事实证明斯芬克斯确实需要open()来完成它的工作。

最新更新