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