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

时间:2013-08-23 11:04:03

标签: python python-sphinx

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

我的项目结构如下:

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中读取配置

虽然“make 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文件时,它会转到另一行simmilar,并为另一个文件抛出相同的错误。

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

因为它不适用于“./file”或“file”。它开始只为“../file”工作 - 当我改变了所有的路径,但“毁坏”python工作,因为python路径被破坏了。

2 个答案:

答案 0 :(得分:2)

问题是open()的行为。像open()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'))

答案 1 :(得分:2)

在为某些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

有一会儿,我尝试了mocking open(),但事实证明,sphinx确实需要open()来完成它的工作。