14

次のコードを使用して、スクリプト内からインタラクティブ コンソールを起動できます。

import code

# do something here

vars = globals()
vars.update(locals())
shell = code.InteractiveConsole(vars)
shell.interact()

次のようにスクリプトを実行すると:

$ python my_script.py

インタラクティブ コンソールが開きます。

Python 2.7.2+ (default, Jul 20 2012, 22:12:53) 
[GCC 4.6.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>

コンソールにはすべてのグローバルとローカルがロードされており、簡単にテストできるのでとても便利です。

ここでの問題は、Python コンソールを起動するときに矢印が通常のように機能しないことです。エスケープされた文字をコンソールに表示するだけです。

>>> ^[[A^[[B^[[C^[[D

これは、上下の矢印キーを使用して以前のコマンドを呼び出すことができず、左右の矢印キーを使用して行を編集することもできないことを意味します。

それがなぜなのか、および/またはそれを回避する方法を誰かが知っていますか?

4

2 に答える 2

34

チェックアウトしreadlinerlcompleter:

import code
import readline
import rlcompleter

# do something here

vars = globals()
vars.update(locals())
readline.set_completer(rlcompleter.Completer(vars).complete)
readline.parse_and_bind("tab: complete")
shell = code.InteractiveConsole(vars)
shell.interact()
于 2013-11-03T15:28:13.327 に答える
1

これは私が使用するものです:

def debug_breakpoint():
    """
    Python debug breakpoint.
    """
    from code import InteractiveConsole
    from inspect import currentframe
    try:
        import readline # noqa
    except ImportError:
        pass

    caller = currentframe().f_back

    env = {}
    env.update(caller.f_globals)
    env.update(caller.f_locals)

    shell = InteractiveConsole(env)
    shell.interact(
        '* Break: {} ::: Line {}\n'
        '* Continue with Ctrl+D...'.format(
            caller.f_code.co_filename, caller.f_lineno
        )
    )

たとえば、次のスクリプトを考えてみましょう。

a = 10
b = 20
c = 'Hello'

debug_breakpoint()

a = 20
b = c
c = a

mylist = [a, b, c]

debug_breakpoint()


def bar():
    a = '1_one'
    b = '2+2'
    debug_breakpoint()

bar()

実行すると、このファイルは次の動作を示します。

$ python test_debug.py
* Break: test_debug.py ::: Line 24
* Continue with Ctrl+D...
>>> a
10
>>>
* Break: test_debug.py ::: Line 32
* Continue with Ctrl+D...
>>> b
'Hello'
>>> mylist
[20, 'Hello', 20]
>>> mylist.append(a)
>>>
* Break: test_debug.py ::: Line 38
* Continue with Ctrl+D...
>>> a
'1_one'
>>> mylist
[20, 'Hello', 20, 20]
于 2015-02-10T03:31:07.030 に答える