2010-11-08 7 views
34

Quiero construir documentos html utilizando un virtualenv en lugar del entorno nativo en mi máquina.¿Cómo hacer que sphinx busque módulos en virtualenv mientras construye html?

he introducido el virtualenv pero cuando corro make html recibo mensajes de error diciendo que el módulo no puede ser importado - Yo sé los errores son debidos al módulo no esté disponible en mi entorno nativo. ¿Cómo puedo especificar qué entorno se debe utilizar al buscar documentos (por ejemplo, el virtualenv)?

Respuesta

40

El problema aquí es que make html usa el comando sphinx-build como un comando de shell normal, que especifica explícitamente qué intérprete de Python usar en la primera línea del archivo (es decir, #!/usr/bin/python). Si se invoca Python de esta manera, no usará su entorno virtual.

Una manera rápida y sucia de esto es llamando explícitamente al script de Python sphinx-build de un intérprete. En el Makefile, esto se puede lograr mediante el cambio SPHINXBUILD a lo siguiente:

SPHINXBUILD = python <absolute_path_to_sphinx-build-file>/sphinx-build 

Si no desea modificar su Makefile También puede hacer pasar este parámetro desde la línea de comandos, de la siguiente manera:

make html SPHINXBUILD='python <path_to_sphinx>/sphinx-build' 

Ahora, si ejecuta make build desde su entorno VirtualEnv, debería usar el intérprete de Python desde su entorno y debería ver a Sphinx encontrar todos los accesorios que necesita.

Soy consciente de que esta no es una solución clara, ya que un Makefile como este no debe asumir ninguna ubicación específica para el archivo sphinx-build, por lo que cualquier sugerencia para una solución más adecuada es bienvenida.

+13

Usted puede utilizar el [función de shell] (http://www.gnu.org/software/make/manual/make.html#Shell-Function) para evitar el hardcoding de la ruta absoluta: '' SPHINXBUILD = python $ (shell que sphinx-build) ' ' – ento

+2

Prefiero sugerir' SPHINXBUILD = python -m sphinx' (a partir de Sphinx 1.4.5 es el mismo), que es más portable en make y evita una subshell. – bufh

+0

Esta respuesta me salvó. ¡Gracias! Solo quería agregar que también funciona bien en 'scl', así:' scl enable python27 'make html SPHINXBUILD =/nfs/tools/lib/python/2.7/current/bin/sphinx-build'' –

39

El problema es detectado correctamente por Mathijs.

$ which sphinx-build 
/usr/local/bin/sphinx-build 

Resolví este problema al instalar sphinx en el entorno virtual.

Con el entorno activado:

$ source /home/migonzalvar/envs/myenvironment/bin/activate 
$ pip install sphinx 
$ which sphinx-build 
/home/migonzalvar/envs/myenvironment/bin/sphinx-build 

Parece bastante limpio.

+3

Esta es la solución más limpia de lejos, no se requiere hackear Makefiles, etc. Debe ser la solución aceptada, en mi humilde opinión. – Jeet

+1

+1 esta respuesta debe combinarse en la respuesta aceptada –

+0

Esta es la solución correcta. La idea de Mathijs es cercana, pero esta es exactamente lo que debes hacer. ¡Por favor, márquelo como aceptado! – eepp

0

Tuve el mismo problema, pero no pude usar la solución aceptada porque no usé Makefile. Estaba llamando al sphinx-build desde un archivo de compilación de python personalizado. Lo que realmente quería hacer era llamar al sphinx-build con el mismo entorno exacto con el que estaba llamando a mi script de construcción python. Jugando con caminos era demasiado complicado y propenso a errores, por lo que acabó con lo que parece a mí como una solución elegante, que consiste en "manual" cargar el punto de entrada de escritura de la consola y lo llaman:

from pkg_resources import load_entry_point 
cmd = load_entry_point('Sphinx', 'console_scripts', 'sphinx-build') 
cmd(['sphinx-build', basepath, destpath]) 
Cuestiones relacionadas