Как отлаживать Python-приложение под uWSGI?
Описание проблемы:
Когда я пытаюсь использовать отладчик python pdb под uWSGI, выполнение не останавливается на точке останова, вместо этого возвращается трассировка.
Вот код:
def application(env, start_response):
import pdb; pdb.set_trace()
start_response('200 OK', [('Content-Type','text/html')])
return "Hello World"
Вот как я его запускаю:
uwsgi --http 127.0.0.1:7777 --wsgi-file uwsgi_test.py
Вот что я получаю:
/home/andrey/Development/ttt/uwsgi_test.py(3)application()
-> start_response('200 OK', [('Content-Type','text/html')])
(Pdb)
Traceback (most recent call last):
File "uwsgi_test.py", line 3, in application
start_response('200 OK', [('Content-Type','text/html')])
File "uwsgi_test.py", line 3, in application
start_response('200 OK', [('Content-Type','text/html')])
File "/usr/lib/python2.7/bdb.py", line 48, in trace_dispatch
return self.dispatch_line(frame)
File "/usr/lib/python2.7/bdb.py", line 67, in dispatch_line
if self.quitting: raise BdbQuit
bdb.BdbQuit
[pid: 11421|app: 0|req: 1/1] 127.0.0.1 () {32 vars in 366 bytes} [Sun Aug 25 13:12:06 2013] GET / => generated 0 bytes in 63 msecs (HTTP/1.1 500) 0 headers in 0 bytes (0 switches on core 0)
Я ожидаю, что выполнение остановится на точке останова, чтобы я мог отлаживать код, но вместо этого происходят ошибки. Помогите, пожалуйста!
2 ответ(ов)
Как сервер, uWSGI закрывает стандартный ввод (stdin), фактически перенаправляя его в /dev/null.
Если вам необходимо использовать стандартный ввод (например, для отладки в терминале), добавьте следующий параметр:
--honour-stdin
Это позволит сохранить доступ к stdin в вашем приложении.
Чтобы установить удалённый отладчик, выполните следующую команду:
pip install remote-pdb
Затем установите точку останова в вашем приложении следующим образом:
from remote_pdb import RemotePdb
RemotePdb('127.0.0.1', 4444).set_trace()
После этого подключитесь к удалённому отладчику через telnet:
# Перезапустите uwsgi, чтобы применить изменения
...
# Вызовите действие, которое сработает на точку останова (сделайте что-то, чтобы вызвать set_trace)
...
# Подключитесь к отладчику
telnet 127.0.0.1 4444
Рекомендуется запускать uWSGI с одним рабочим процессом или потоком, чтобы избежать конфликтов между удалёнными отладчиками.
Как запустить uWSGI с использованием virtualenv?
Как изменить порядок столбцов в DataFrame?
'pip' не распознан как командa внутреннего или внешнего формата
Почему statistics.mean() работает так медленно?
Есть ли разница между поднятием экземпляра класса Exception и самого класса Exception?