сделать пакеты, установленные в virtualenv, видимыми для sphinx

Я использую 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 умирает из-за ImportError стороннего пакета, но описание процедуры, которую я выбрал, находится в неработающем связь.


person mariotomo    schedule 27.07.2015    source источник
comment
Теперь я помещаю все в одну и ту же виртуальную среду, я помещаю sphinx в свою собственную виртуальную среду, а затем также устанавливаю все проекты, которые я хочу задокументировать, в этой среде. но это звучит как уродливый обходной путь для меня.   -  person mariotomo    schedule 28.07.2015


Ответы (1)


Проблема в том, что пакеты не включены напрямую в каталог site-packages virtualenv, вам нужно будет указать полный путь, чтобы иметь возможность импортировать пакет оттуда. Я использую следующий хак:

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, который я хотел бы импортировать.

Обратите внимание, что это подвержено ошибкам, особенно если у вас несколько версий модуля, но пока это работает для меня.

person marbu    schedule 11.03.2016