2012-01-16 5 views
14

Иногда я получаю ошибки, которые, как я подозреваю, являются результатом моего приложения Django, используя глобально установленные модули Python/приложения Django, а не те, что находятся в его виртуальном пространстве.Как проверить, был ли virtualenv создан с '-no-site-packages'?

Есть ли способ проверить, был ли виртуальный файл моего приложения создан с помощью «-no-site-packages» без необходимости его удаления, а затем повторно создать его следующим образом?

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

Несомненно, должен быть лучший способ! Благодарю.

ответ

21

Там есть файл в <env>/lib/pythonX.X/ называется no-global-site-packages.txt при создании виртуальной среды с --no-site-packages.

Просто попытался это с 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

Простым способом является открытие интерактивной оболочки python и выполнение import somemodule; print somemodule, а затем проверка пути, откуда был импортирован этот модуль.

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

против

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

Это действительный только в том случае, если у вас есть тот же самый модуль, установленный в оба места. Вы не можете попытаться импортировать оба в одно и то же время (если вы не измените pythonpath) –

+0

Если это не так, вы получите «ImportError» - в зависимости от того, где вы его знаете, он установлен только в местоположении X. – ThiefMaster

+0

Истина, если у вас установлен модуль в сайтах. Но тогда вам нужно выбрать модуль, который вы _know_ там, и на самом деле проверить на 'ImportError' –

3

@ Решение Роба действительна для новых версий, я посмотрел в код :).

Если у вас есть старый (например, мой 1.4.5), вы можете проверить путь python. Если у вас есть каталог по умолчанию «site-packages» в пути (например,/usr/lib/python/site-packages), тогда ваш virtualenv был создан с сайтом-пакетами.

Вы можете проверить это с чем-то вроде:

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

Если у вас --no-сайт-пакеты, все ваши пути будут как:

/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 

В противном случае, вы У меня есть что-то вроде:

/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