2010-11-08 5 views
34

Voglio creare documenti html utilizzando un virtualenv invece dell'ambiente nativo sulla mia macchina.Come fare a sfogliare i moduli in virtualenv mentre si costruisce l'html?

ho inserito il virtualenv ma quando corro make html ricevo errori dicendo che il modulo non può essere importato - Io so gli errori sono dovuti al modulo di essere disponibile nel mio ambiente nativo. Come posso specificare quale ambiente deve essere usato durante la ricerca di documenti (es. Virtualenv)?

risposta

40

Il problema è che make html utilizza il comando sphinx-build come un normale comando di shell, che specifica esplicitamente quale interprete Python utilizzare nella prima riga del file (ad esempio #!/usr/bin/python). Se Python viene richiamato in questo modo, non utilizzerà il tuo ambiente virtuale.

Un modo rapido e disordinato è chiamando esplicitamente lo script Python sphinx-build da un interprete. Nel Makefile, questo può essere realizzato modificando SPHINXBUILD al seguente:

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

Se non si desidera modificare il vostro Makefile si può anche passare questo parametro dalla riga di comando, come segue:

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

Ora se si esegue make build dall'interno dell'ambiente VirtualEnv, si dovrebbe utilizzare l'interprete Python dall'interno dell'ambiente e si dovrebbe vedere Sphinx trovando tutti gli oggetti necessari.

Sono ben consapevole che questa non è una soluzione ordinata, in quanto uno Makefile come questo non dovrebbe assumere alcuna posizione specifica per il file sphinx-build, quindi qualsiasi suggerimento per una soluzione più adeguata è accolto calorosamente.

+13

È possibile utilizzare la [funzione shell] (http://www.gnu.org/software/make/manual/make.html#Shell-Function) per evitare di codificare il percorso assoluto: '' SPHINXBUILD = python $ (shell which sphinx-build) ' ' – ento

+2

Preferisco suggerire' SPHINXBUILD = python -m sphinx' (come di Sphinx 1.4.5 è lo stesso), che è più portabile su make ed evita una subshell. – bufh

+0

Questa risposta mi ha salvato. Grazie! Volevo solo aggiungere che funziona bene anche in 'scl', come questo:' scl enable python27 'crea html SPHINXBUILD =/nfs/tools/lib/python/2.7/current/bin/sphinx-build'' –

39

Il problema è stato individuato correttamente da Mathijs.

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

Ho risolto questo problema installando la sfinge stessa nell'ambiente virtuale.

Con l'ambiente attivato:

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

Sembra abbastanza pulito.

+3

Questa è la soluzione più pulita di gran lunga - non sono richiesti makefile di hacking ecc. Dovrebbe essere la soluzione accettata, IMHO. – Jeet

+1

+1 questa risposta deve essere unita nella risposta accettata –

+0

Questa è la soluzione corretta. L'idea di Mathijs è vicina, ma questo è esattamente ciò che dovresti fare. Si prega di contrassegnarlo come accettato! – eepp

0

Ho avuto lo stesso problema, ma non ho potuto utilizzare la soluzione accettata perché non ho utilizzato il Makefile. Stavo chiamando sphinx-build da un file di configurazione python personalizzato. Quello che volevo veramente fare era chiamare lo sphinx-build con lo stesso identico ambiente con cui stavo chiamando il mio script di sviluppo python. Giocherellare con percorsi era troppo complicato e soggetto a errori, quindi ho finito con quello che sembra a me come una soluzione elegante, che è quello di "manualmente" caricare il punto di ingresso sceneggiatura console e chiamarlo:

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