如何在构建html时让sphinx在virtualenv中寻找模块?

cer*_*ros 40 virtualenv python-sphinx

我想使用virtualenv而不是我的机器上的本机环境来构建html文档.

我已经进入了virtualenv,但是当我运行时,make html我得到错误,说模块无法导入 - 我知道错误是由于模块在我的本机环境中不可用.如何在搜索文档时指定应该使用哪个环境(例如virtualenv)?

mig*_*var 54

Mathijs正确地发现了这个问题.

$ which sphinx-build
/usr/local/bin/sphinx-build
Run Code Online (Sandbox Code Playgroud)

我解决了在虚拟环境中安装sphinx本身的问题.

随着环境激活:

$ source /home/migonzalvar/envs/myenvironment/bin/activate
$ pip install sphinx
$ which sphinx-build
/home/migonzalvar/envs/myenvironment/bin/sphinx-build
Run Code Online (Sandbox Code Playgroud)

看起来很整洁.

  • 到目前为止,这是最干净的解决方案 - 不需要黑客Makefiles等.应该是公认的解决方案,恕我直言. (6认同)
  • a) 它没有用。b) 我不想用像狮身人面像这样沉重的东西污染生产`requirements.txt`。根据 Mathijs `make html SPHINXBUILD='python <path_to_sphinx>/sphinx-build'` 我从 `which sphinx-build` 获得路径。现在,当我说 * 不起作用 * 时,可能是因为 sphinx 已经在全局 pip 中,不知道。所以,*这应该被接受*是非常主观的。 (3认同)
  • 如果您已经创建了可以访问全局包的虚拟环境并且安装了全局 Sphinx,这将不起作用。 (2认同)

小智 47

这里的问题是make html使用sphinx-build命令作为普通的shell命令,它明确指定在文件的第一行使用哪个Python解释器(即.#!/usr/bin/python).如果以这种方式调用Python,它将不会使用您的虚拟环境.

一个快速而肮脏的方法是通过sphinx-build从解释器显式调用Python脚本.在此Makefile,可以通过更改SPHINXBUILD 为以下内容来实现:

SPHINXBUILD   = python <absolute_path_to_sphinx-build-file>/sphinx-build
Run Code Online (Sandbox Code Playgroud)

如果您不想修改,Makefile也可以从命令行传递此参数,如下所示:

make html SPHINXBUILD='python <path_to_sphinx>/sphinx-build'
Run Code Online (Sandbox Code Playgroud)

现在,如果您make build在VirtualEnv环境中执行,它应该在您的环境中使用Python解释器,您应该看到Sphinx找到它需要的所有好东西.

我很清楚这不是一个简洁的解决方案,因为Makefile这样不应该假设该sphinx-build文件的任何特定位置,因此对于更合适的解决方案的任何建议都受到热烈欢迎.

  • 您可以使用[shell函数](http://www.gnu.org/software/make/manual/make.html#Shell-Function)来避免硬编码绝对路径:``SPHINXBUILD = python $(sphinx的shell) -build)`` (14认同)
  • 我宁愿建议`SPHINXBUILD = python -m sphinx`(从Sphinx 1.4.5开始它是相同的),它在make之间更加便携并避免使用子shell. (5认同)