我正在尝试为我的烧瓶项目构建文档,我遇到了路径问题
我的项目结构如下:
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路径被破坏了。
答案 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()来完成它的工作。