2010-11-08 7 views
34

Chcę budować dokumenty HTML przy użyciu virtualenv zamiast środowiska macierzystego na moim komputerze.Jak sprawić, aby sfinks szukał modułów w virtualenv podczas budowania html?

mam wszedł virtualenv ale gdy uruchamiam make html otrzymuję błędy mówiąc moduł nie mogą być importowane - wiem błędy spowodowane są do modułu będącego niedostępne w moim rodzimym środowisku. Jak określić, które środowisko powinno być używane podczas wyszukiwania dokumentów (np. Virtualenv)?

Odpowiedz

40

Problem polega na tym, że make html używa komendy sphinx-build jako normalnej komendy powłoki, która jawnie określa, który interpreter języka Python ma użyć w pierwszym wierszu pliku (tj. #!/usr/bin/python). Jeśli Python zostanie wywołany w ten sposób, nie użyje twojego środowiska wirtualnego.

Szybkim i brudnym sposobem jest otwarcie wywołania skryptu Python sphinx-build od tłumacza. W Makefile, można to osiągnąć poprzez zmianę SPHINXBUILD na następujące kwestie:

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

Jeśli nie chcesz zmodyfikować Makefile można również przekazać ten parametr z wiersza poleceń, co następuje:

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

Teraz, jeśli wykonasz make build z poziomu środowiska VirtualEnv, powinieneś użyć interpretera Pythona z twojego środowiska i powinieneś zobaczyć Sphinx znajdującego wszystkie potrzebne mu upominki.

Doskonale zdaję sobie sprawę, że nie jest to zadowalające rozwiązanie, ponieważ Makefile w ten sposób nie powinno zakładać żadnej konkretnej lokalizacji dla pliku sphinx-build, więc wszelkie sugestie dotyczące bardziej odpowiedniego rozwiązania są mile widziane.

+13

można użyć [funkcja powłoki] (http://www.gnu.org/software/make/manual/make.html#Shell-Function), aby uniknąć zakodowania bezwzględnej ścieżki: '' SPHINXBUILD = python $ (powłoka, która tworzy sphinx) ' ' – ento

+2

Wolałbym zasugerować' SPHINXBUILD = python -m sphinx' (od Sphinx 1.4.5 jest taki sam), który jest bardziej przenośny przez make i unikanie podpowłoki. – bufh

+0

Ta odpowiedź mnie uratowała. Dzięki! Chciałem tylko dodać, że działa to również w 'scl', tak jak to:' scl enable python27 'make html SPHINXBUILD =/nfs/tools/lib/python/2.7/current/bin/sphinx-build'' –

39

Problem został poprawnie wykryty przez Mathijs.

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

Rozwiązałem ten problem instalując samego Sphinx w środowisku wirtualnym.

Z środowisku aktywnym:

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

Wydaje się wystarczająco czysty.

+3

To zdecydowanie najczystsze rozwiązanie - nie wymaga hakerskich plików Makefiles itp. Powinien być przyjętym rozwiązaniem, IMHO. – Jeet

+1

+1 ta odpowiedź powinna zostać połączona z zaakceptowaną odpowiedzią –

+0

To jest poprawne rozwiązanie. Pomysł Mathijsa jest bliski, ale ten jest dokładnie tym, co powinieneś zrobić. Proszę oznaczyć to jako zaakceptowane! – eepp

0

Miałem ten sam problem, ale nie mogłem użyć zaakceptowanego rozwiązania, ponieważ nie korzystałem z pliku Makefile. Wezwałem sphinx-build z niestandardowego pliku budowania Pythona. To, co naprawdę chciałem zrobić, to zadzwonić pod numer sphinx-build z dokładnie tym samym środowiskiem, z którym nazwałem swój skrypt budujący pythona. Manipulując ścieżek był zbyt skomplikowany i podatny na błędy, więc skończyło się na tym, co wydaje mi się eleganckie rozwiązanie, jakim jest „ręcznie” załadować punkt wejścia skryptu konsoli i nazywają go:

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