2012-01-16 12 views
14

A volte ricevo errori che sospetto siano il risultato della mia app Django utilizzando i moduli Python installati a livello globale/le app Django invece di quelle all'interno del suo virtualenv.Come verificare se virtualenv è stato creato con "--no-site-packages"?

C'è un modo per verificare se il virtualenv della mia app è stato creato con "--no-site-packages" senza doverlo eliminare, quindi ricrearlo come segue?

deactivate 
rmvirtualenv my_env 
mkvirtualenv my_env --no-site-packages 
workon my_env 
pip install -r requirements.txt 

Sicuramente ci deve essere un modo migliore! Grazie.

risposta

21

C'è un file in <env>/lib/pythonX.X/ chiamato no-global-site-packages.txt quando si crea un ambiente virtuale con --no-site-packages.

appena provato questo con virtualenv 1.7:

% virtualenv --no-site-packages env.without 
% virtualenv --system-site-packages env.with 

% find env.without | sed 's/env.without//' > files.without 
% find env.with | sed 's/env.with//' > files.with 

% diff files.with* 
230a231 
> /lib/python3.2/no-global-site-packages.txt 
5

Un modo semplice è aprire la shell python interattiva ed eseguire import somemodule; print somemodule e quindi controllare il percorso da dove quel modulo è stato importato.

>>> import flask; print flask 
<module 'flask' from '/home/xxx/dev/xxx/env/lib/python2.7/site-packages/flask/__init__.pyc'> 

vs.

>>> import flask; print flask 
<module 'flask' from '/usr/lib64/python2.7/site-packages/flask/__init__.pyc'> 
+0

Questo è valido solo se si ha lo stesso modulo installato in entrambi i posti Non è possibile provare a importare entrambi contemporaneamente (a meno che non si modifichi il pythonpath) –

+0

In caso contrario, si otterrà un 'ImportError' - a seconda di dove lo si ottiene si sa che è stato installato solo nella posizione X. – ThiefMaster

+0

Vero se il modulo è installato nei pacchetti del sito. Ma poi devi selezionare un modulo che tu sai che è lì e di fatto controlla "ImportError' –

3

@ soluzione di Rob è valida per le versioni più recenti, ho guardato nel codice :).

Se si dispone di uno vecchio (come il mio 1.4.5), è possibile controllare il percorso Python. Se hai la directory predefinita "site-packages" nel percorso (ad es./Usr/lib/python/site-packages), allora il tuo virtualenv è stato creato con i pacchetti del sito.

È possibile controllarlo fuori da qualcosa come:

for p in sys.path: 
    if p.find("site-packages") >= 0: 
    print p 

Se trovassi --no-site-packages, tutti i percorsi sarebbe come:

/home/user/virtualenv/myenv/lib/python2.6/site-packages/distribute-0.6.10-py2.6.egg 
/home/user/virtualenv/myenv/lib/python2.6/site-packages/pip-1.0.2-py2.6.egg 
/home/user/virtualenv/myenv/lib/python2.6/site-packages 

In caso contrario, Avrà qualcosa tipo:

/home/user/virtualenv/myenv/lib/python2.6/site-packages/distribute-0.6.10-py2.6.egg 
/home/user/virtualenv/myenv/lib/python2.6/site-packages/pip-1.0.2-py2.6.egg 
/home/user/virtualenv/myenv/lib/python2.6/site-packages 
/usr/local/lib/python2.6/site-packages 
Problemi correlati