【问题标题】:python curses remote debugging pdevd error in setuptermpython curses setupterm中的远程调试pdevd错误
【发布时间】:2015-05-08 01:16:12
【问题描述】:

是否可以在 PyCharm 中远程调试 curse 程序?如何设置?

我遵循 PyCharm 4.0.8 指令,将其添加到来自“npyscreen-4.8.7”的“EXAMPLE.py”。

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”。
  • 如果将“setupterm”的第一个参数更改为“term='xterm'”,即使使用“pydevd”也会成功。

我想问题是如何让“pydevd”设置正确的“TERM”?

【问题讨论】:

    标签: python debugging ncurses curses python-curses


    【解决方案1】:

    指出 pydevd 中 TERM 的硬编码设置的各种提示引导我进入这个序列,这对我有用:

    #
    # 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'
    

    【讨论】:

    • 虽然我将此答案设置为已接受,但这看起来不错,但未经我验证。感谢您的回答。
    【解决方案2】:

    虽然答案之一可能是:更改 /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()
    

    【讨论】:

    • TERM 设置为“emacs”可能是不正确的,除非碰巧在 emacs 程序中运行。
    • 其实是IDE控制台需要设置成emacs。 PyCharm 和 Eclipse 都可以。
    • 这可能是由于死记硬背。 ncurses 不提供名为“emacs”的条目(并且Emacs documentation 不假定已安装)。很久以前,“eterm”条目就已经过时了。
    猜你喜欢
    • 2012-03-18
    • 2014-03-10
    • 2023-03-22
    • 2012-11-24
    • 2010-10-16
    • 2014-03-02
    • 2013-09-22
    • 2010-09-27
    • 2018-01-29
    相关资源
    最近更新 更多