2015-05-08 5 views
0

Возможно ли отлаживать программу проклятия удаленно в PyCharm? Как настроить его?python curses удаленная отладка pdevd ошибка в setupterm

Я следовал инструкциям PyCharm 4.0.8, добавил это к «EXAMPLE.py» с «npyscreen-4.8.7».

import pydevd 
pydevd.settrace('localhost', port=8899, stdoutToServer=False, stderrToServer=True) 

И всегда впадает в ошибки в "setupterm":

$ PYTHONPATH=~/bin/pycharm-debug.egg python EXAMPLE.py 
Traceback (most recent call last): 
    File "EXAMPLE.py", line 34, in <module> 
    App.run() 
    File "/home/.../npyscreen-4.8.7/npyscreen/apNPSApplication.py", line 30, in run 
    return npyssafewrapper.wrapper(self.__remove_argument_call_main) 
    File "/home/.../npyscreen-4.8.7/npyscreen/npyssafewrapper.py", line 41, in wrapper 
    wrapper_no_fork(call_function) 
    File "/home/.../npyscreen-4.8.7/npyscreen/npyssafewrapper.py", line 83, in wrapper_no_fork 
    _SCREEN = curses.initscr() 
    File "/usr/lib64/python2.6/curses/__init__.py", line 33, in initscr 
    fd=_sys.__stdout__.fileno()) 
_curses.error: setupterm: could not find terminal 

Проблема заключается в том, что pydevd изменилась среда "TERM" от "XTerm" в "Emacs". Это можно проверить с помощью небольшой тестовой программы.

import pydevd 
pydevd.settrace('localhost', port=8899, stdoutToServer=False, stderrToServer=True) 
import os as _os 
import sys as _sys 
import curses 
print " my term: ", _os.environ.get("TERM", "unknown"), "\n" 
print " my fd: ", _sys.__stdout__.fileno(), "\n" 
print "\n ok 1 \n" 
curses.setupterm(term=_os.environ.get("TERM", "unknown"), 
#curses.setupterm(term='xterm', 
       fd=_sys.__stdout__.fileno()) 
print "\n ok 2 \n" 
  • При удалении двух линий с "pdevd", программа завершается успешно. «TERM» распечатывается «xterm».
  • Если изменить 1-й аргумент на «setupterm» на «term='xterm'», даже с «pydevd» он преуспевает.

Я думаю, вопрос в том, как «pydevd» установить правильный «TERM»?

ответ

1

Это различные намеки указывая жесткая кодировка TERM в pydevd привела меня к этой последовательности, которая работает для меня:

# 
# From the instructions in the PyCharm remote debug setup screen, 
# add this to your code before curses is initialised. 
# 
import pydevd 
pydevd.settrace('localhost', port=8899) 
# 
# And then to fixup the broken setting in pydevd... 
# 
os.environ['TERM'] = 'xterm' 
+0

Это выглядит хорошо, но не проверено мной, хотя я установил этот ответ как принятый. Спасибо за ответ. – minghua

1

В то время как один из ответа может быть это: изменение /usr/lib/python2.6/curses/__init__.py заставить TERM как:

def initscr(): 
    import _curses, curses 
    # we call setupterm() here because it raises an error 
    # instead of calling exit() in error cases. 
    _os.environ['TERM'] = 'xterm' ##hack force 'xterm' for pydevd debugging. 
    setupterm(term=_os.environ.get("TERM", "unknown"), 
       fd=_sys.__stdout__.fileno()) 
    stdscr = _curses.initscr() 
    for key, value in _curses.__dict__.items(): 
     if key[0:4] == 'ACS_' or key in ('LINES', 'COLS'): 
      setattr(curses, key, value) 

    return stdscr 

оригинальный источник, который изменил «TERM» здесь:

$ head plugins/org.python.pydev_4.0.0.201504132356/pysrc/pydev_ipython_console.py 
import sys 
from pydev_console_utils import BaseInterpreterInterface 

import os 

os.environ['TERM'] = 'emacs' #to use proper page_more() for paging 


# Uncomment to force PyDev standard shell. 
# raise ImportError() 
+0

Установка 'TERM' в" emacs ", вероятно, неверна, если в программе emacs не работает. –

+0

На самом деле консоли IDE необходимо установить его в emacs. И PyCharm, и Eclipse делают. – minghua

+0

Скорее всего, это связано с копированием файлов. ncurses не предоставляет запись с именем «emacs» (и [документация Emacs] (http://www.gnu.org/software/emacs/manual/html_node/efaq/Termcap_002fTerminfo-entries-for-Emacs.html) t предположим, что один установлен). Это было давно устаревшим в записи «eterm». –