41 votes

Comment faire en sorte que sphinx recherche les modules dans le virtualenv pendant la construction du html ?

Je veux construire des documents html en utilisant un virtualenv au lieu de l'environnement natif de ma machine.

J'ai entré le virtualenv mais quand j'exécute make html J'obtiens des erreurs disant que le module ne peut pas être importé - je connaître les erreurs sont dues au fait que le module n'est pas disponible dans mon environnement natif. Comment puis-je spécifier quel environnement doit être utilisé lors de la recherche de la documentation (par exemple le virtualenv) ?

55voto

migonzalvar Points 549

Le problème est correctement repéré par Mathijs.

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

J'ai résolu ce problème en installant sphinx lui-même dans l'environnement virtuel.

Avec l'environnement activé :

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

Ça semble assez soigné.

47voto

Mathijs Points 415

Le problème ici est que make html utilise le sphinx-build comme une commande shell normale, qui spécifie explicitement l'interpréteur Python à utiliser dans la première ligne du fichier (c.-à-d. #!/usr/bin/python ). Si Python est invoqué de cette manière, il n'utilisera pas votre environnement virtuel.

Une façon rapide et sale de contourner ce problème est d'appeler explicitement la fonction sphinx-build Python script à partir d'un interpréteur. Dans le Makefile cela peut être réalisé en modifiant SPHINXBUILD à ce qui suit :

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

Si vous ne voulez pas modifier votre Makefile vous pouvez également passer ce paramètre depuis la ligne de commande, comme suit :

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

Maintenant, si vous exécutez make build à partir de votre environnement VirtualEnv, il devrait utiliser l'interpréteur Python à partir de votre environnement et vous devriez voir Sphinx trouver tous les éléments dont il a besoin.

Je suis bien conscient qu'il ne s'agit pas d'une solution parfaite, puisqu'une Makefile comme celui-ci ne doit pas supposer un emplacement spécifique pour le sphinx-build Toute suggestion concernant une solution plus appropriée est donc la bienvenue.

0voto

Virgil Dupras Points 1603

J'ai eu le même problème, mais je n'ai pas pu utiliser la solution acceptée parce que je n'ai pas utilisé le Makefile. J'appelais sphinx-build à partir d'un fichier de construction python personnalisé. Ce que je voulais vraiment faire était d'appeler sphinx-build avec exactement le même environnement que celui avec lequel j'appelais mon build python script. Le tripotage des chemins était trop compliqué et source d'erreurs, j'ai donc fini par trouver ce qui me semble être une solution élégante, qui consiste à charger "manuellement" le point d'entrée script de la console et à l'appeler :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X