ipdb запускает ImportError

ipdb вызывает ошибку импорта для меня, когда я запускаю свой сайт Django локально. Я работаю над Python 2.7 и в виртуальной среде.

which ipdb показывает путь (/usr/local/bin/ipdb), так же как и which ipython, что удивило меня, так как я думал, что это должно показать мой путь вен (но разве это не должно работать, если оно глобально, в любом случае?). Так я попробовал pip install --target=/path/to/venv ipdb и теперь он появляется в pip freeze (чего раньше не было), но все равно выдает ошибку импорта.

which pip дает /Users/myname/.virtualenvs/myenv/bin/pip/

Мой путь: /Users/myname/.virtualenvs/myenv/bin:/Users/myname/.venvburrito/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/myname/bin:/usr/local/bin

sys.path:'/Users/myname/Dropbox/myenv', '/Users/myname/.venvburrito/lib/python2.7/site-packages/pip-1.4.1-py2.7.egg', '/Users/myname/.venvburrito/lib/python2.7/site-packages', '/Users/myname/.venvburrito/lib/python2.7/site-packages/setuptools-8.2-py2.7.egg', '/Users/myname/.virtualenvs/myenv/lib/python27.zip', '/Users/myname/.virtualenvs/myenv/lib/python2.7', '/Users/myname/.virtualenvs/myenv/lib/python2.7/plat-darwin', '/Users/myname/.virtualenvs/myenv/lib/python2.7/plat-mac', '/Users/myname/.virtualenvs/myenv/lib/python2.7/plat-mac/lib-scriptpackages', '/Users/myname/.virtualenvs/myenv/Extras/lib/python', '/Users/myname/.virtualenvs/myenv/lib/python2.7/lib-tk', '/Users/myname/.virtualenvs/myenv/lib/python2.7/lib-old', '/Users/myname/.virtualenvs/myenv/lib/python2.7/lib-dynload', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages', '/Users/myname/.virtualenvs/myenv/lib/python2.7/site-packages']

Если я запускаю ipdb из терминала, он работает нормально. Я попытался перезапустить мой терминал.

Трассировки стека:

Traceback (most recent call last):
  File "/Users/myname/.virtualenvs/myenv/lib/python2.7/site-packages/django/core/handlers/base.py", line 149, in get_response
    response = self.process_exception_by_middleware(e, request)
  File "/Users/myname/.virtualenvs/myenv/lib/python2.7/site-packages/django/core/handlers/base.py", line 147, in get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Users/myname/.virtualenvs/myenv/lib/python2.7/site-packages/django/views/generic/base.py", line 68, in view
    return self.dispatch(request, *args, **kwargs)
  File "/Users/myname/.virtualenvs/myenv/lib/python2.7/site-packages/django/views/generic/base.py", line 88, in dispatch
    return handler(request, *args, **kwargs)
  File "/Users/myname/.virtualenvs/myenv/lib/python2.7/site-packages/django/views/generic/base.py", line 157, in get
    context = self.get_context_data(**kwargs)
  File "/Users/myname/Dropbox/blog/views.py", line 22, in get_context_data
    import ipdb; ipdb.set_trace()
ImportError: No module named ipdb

2 ответа

Решение

Я использовал virtualenv-burrito. Удаление моего венва, обновление буррито (virtualenv-burrito upgrade) и создание новой виртуальной среды решило проблему.

Я просто настроил целую виртуальную среду, чтобы попробовать это, потому что это должно быть простое исправление. Мне удалось настроить ipdb в моей виртуальной среде, и я напишу, что я сделал шаг за шагом.

$ virtualenv foo
$ cd foo
$ source ./bin/activate  # activate venv

... с этой точки зрения which python а также which pip дает мне правильный исполняемый файл Python в моей виртуальной среде. Тогда дальше:

(venv: foo)$ pip install ipython

С этой точки зрения, which ipython дает мне правильный исполняемый файл ipython в моей виртуальной среде. Важно убедиться, что он указывает на правильные исполняемые файлы, если он не показывает правильный исполняемый файл, но глобальный, повторно активируйте вашу виртуальную среду. Крайне важно, чтобы ipython (и все ваши исполняемые файлы) указывали на правильные исполняемые файлы внутри вашего virtualenv.

Тогда я попытаюсь импортировать ipdb:

(venv: foo)$ ipython
In [1]: import ipdb
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input-1-2d6f026194dd> in <module>()
----> 1 import ipdb

ImportError: No module named 'ipdb'

Модуль не найден, потому что он еще не установлен. Давай сделаем это:

(venv: foo)$ pip install ipdb

и попробуйте еще раз:

(venv: foo)$ ipython                                                                                                          [ 16-05-24 22:28 ]
Python 3.5.1 (default, Jan 29 2016, 19:58:36) 
Type "copyright", "credits" or "license" for more information.

IPython 4.2.0 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.

In [1]: import ipdb

In [2]: 

Кажется, это работает для меня. Я использовал zsh а также python3 но это не должно иметь значения. Скорее всего, ваша проблема заключается в том, что он не устанавливается в нужных местах, то есть использует глобальные исполняемые файлы вместо тех, что были из virtualenv.

Из моего virtualenv вы могли видеть, что ipdb установлен:

(venv: foo)$ find . -name ipdb
./lib/python3.5/site-packages/ipdb

Надеюсь все это записать поможет:)

Другие вопросы по тегам