我正在使用sphinx
来记录我的软件。我正在使用virtualenv
进行安装。现在有些软件包只安装在虚拟环境中,而sphinx看不到它们。
我在conf.py
:
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
p = os.path.abspath('..')
sys.path.insert(0, p)
if 'VIRTUAL_ENV' in os.environ:
q = os.sep.join([os.environ['VIRTUAL_ENV'],
'lib', 'python2.7', 'site-packages'])
sys.path.insert(0, q)
p = p + ":" + q
os.environ['PYTHONPATH'] = p
如果我make html
,我会收到这样的警告:
/home/mario/Local/github/Bauble/bauble.classic/doc/api.rst:358: WARNING: autodoc: failed to import class u'TagItemGUI' from module u'bauble.plugins.tag'; the following exception was raised:
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/sphinx/ext/autodoc.py", line 385, in import_object
__import__(self.modname)
File "/home/mario/Local/github/Bauble/bauble.classic/bauble/plugins/tag/__init__.py", line 30, in <module>
from sqlalchemy import *
ImportError: No module named sqlalchemy
我的$VIRTUAL_ENV/lib/python2.7/site-packages
包含SQLAlchemy-1.0.4-py2.7-linux-x86_64.egg
。
肯定与问题Sphinx autodoc dies on ImportError of third party package有关,但我选择遵循的程序描述是在一个断开的链接中。
答案 0 :(得分:1)
问题是包不直接包含在virtualenv的site-packages
目录中,您需要指定能够从那里导入包的完整路径。我使用以下hack:
if 'VIRTUAL_ENV' in os.environ:
site_packages_glob = os.sep.join([
os.environ['VIRTUAL_ENV'],
'lib', 'python2.7', 'site-packages', 'projectname-*py2.7.egg'])
site_packages = glob.glob(site_packages_glob)[-1]
sys.path.insert(0, site_packages)
其中projectname
是我要导入的python模块的名称。
请注意,这很容易出错,尤其是当您有多个版本时 该模块,但到目前为止它对我有用。