Как заставить sphinx искать модули в virtualenv при построении html?
Я хочу создать html-документы с помощью virtualenv вместо собственной среды на моей машине.
Я ввел virtualenv, но когда я запустил make html
, я получаю ошибки, говорящие, что модуль не может быть импортирован. Я знаю, что ошибки связаны с тем, что модуль недоступен в моей родной среде.
Как я могу указать, какую среду следует использовать при поиске документов (например, virtualenv)?
Ответы
Ответ 1
Проблема заключается в том, что make html
использует команду sphinx-build
как обычную команду оболочки, которая явно указывает, какой интерпретатор Python использовать в первой строке файла (т.е. #!/usr/bin/python
). Если Python будет вызван таким образом, он не будет использовать вашу виртуальную среду.
Быстрый и грязный путь вокруг этого заключается в явном вызове sphinx-build
Python script из интерпретатора. В Makefile
это может быть достигнуто путем изменения SPHINXBUILD
на следующее:
SPHINXBUILD = python <absolute_path_to_sphinx-build-file>/sphinx-build
Если вы не хотите изменять свой Makefile
, вы также можете передать этот параметр из командной строки, как показано ниже:
make html SPHINXBUILD='python <path_to_sphinx>/sphinx-build'
Теперь, если вы выполняете make build
в своей среде VirtualEnv, он должен использовать интерпретатор Python из вашей среды, и вы должны увидеть, как Sphinx находит все полезные свойства, которые он требует.
Мне хорошо известно, что это не простое решение, так как Makefile
вроде этого не должно предполагать какого-либо конкретного места для файла sphinx-build
, поэтому приветствуются любые предложения для более подходящего решения.
Ответ 2
Проблема правильно распознана Mathijs.
$ which sphinx-build
/usr/local/bin/sphinx-build
Я решил эту проблему, установив сам sphinx в виртуальную среду.
С активированной средой:
$ source /home/migonzalvar/envs/myenvironment/bin/activate
$ pip install sphinx
$ which sphinx-build
/home/migonzalvar/envs/myenvironment/bin/sphinx-build
Кажется, это достаточно аккуратно.
Ответ 3
У меня была та же проблема, но я не мог использовать принятое решение, потому что не использовал Makefile. Я вызывал sphinx-build
из пользовательского файла сборки python. То, что я действительно хотел сделать, это вызвать sphinx-build
с той же самой средой, с которой я вызывал мою сборку python script с. Поворот с путями был слишком сложным и подвержен ошибкам, поэтому я оказался с тем, что мне кажется элегантным решением, которое заключается в том, чтобы "вручную" загрузить точку входа консоли script и вызвать ее:
from pkg_resources import load_entry_point
cmd = load_entry_point('Sphinx', 'console_scripts', 'sphinx-build')
cmd(['sphinx-build', basepath, destpath])