0

PyCharmでcurseプログラムをリモートでデバッグすることは可能ですか? 設定方法は?

私は 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"
  • " " の 2 行を削除するpdevdと、プログラムは成功します。表示される" "TERMは " xterm" です。
  • " " への第 1 引数を " setupterm" に変更するterm='xterm'と、" pydevd" でも成功します。

pydevd問題は、どのように " " 正しい " " セットアップを行うかということだと思いますTERM

4

2 に答える 2

2

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'
于 2016-09-18T12:18:52.307 に答える
1

答えの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()
于 2015-05-08T02:32:16.320 に答える