2

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

我的项目结构是这样的:

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 时,它显示路径在那里。

当我将完整路径粘贴到 logger.py 中的文件 logger.conf 时,它会转到与此类似的另一行,并为不同的文件引发相同的错误。

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

因为它不适用于“./file”或“file”。它开始仅适用于“../file” - 当我更改所有路径时,但“破坏”了 python 工作,至于 python 路径已损坏。

4

2 回答 2

4

这是open()问题所在。open()诸如and之类的命令chdir()在您现在所在的目录中运行,该目录可能是 makefile 所在的目录。

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

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

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'))
于 2013-09-04T07:26:56.997 回答
3

在为一些不是在我的计算机中运行,而是在嵌入式系统中运行的 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(),但事实证明 sphinx 确实需要 open() 来完成它的工作。

于 2013-10-09T14:10:26.510 回答