programing

코드에서 ipython으로 이동할 수 있습니까?

nasanasas 2020. 10. 11. 10:42
반응형

코드에서 ipython으로 이동할 수 있습니까?


내 디버깅 요구에 pdb대해서는 꽤 좋습니다. 그러나 .NET에 들어갈 수 있다면 훨씬 더 시원하고 도움이 될 것 ipython입니다. 이것이 가능합니까?


ipdbiPython을 표준 pdb에 포함 하는 프로젝트가 있으므로 다음과 같이 할 수 있습니다.

import ipdb; ipdb.set_trace()

일반적인 .NET을 통해 설치할 수 pip install ipdb있습니다.

ipdb매우 짧기 때문에 easy_installing 대신 ipdb.pyPython 경로에 파일을 만들고 다음을 파일에 붙여 넣을 수도 있습니다.

import sys
from IPython.Debugger import Pdb
from IPython.Shell import IPShell
from IPython import ipapi

shell = IPShell(argv=[''])

def set_trace():
    ip = ipapi.get()
    def_colors = ip.options.colors
    Pdb(def_colors).set_trace(sys._getframe().f_back)

IPython 0.11에서는 다음과 같이 코드에 직접 IPython을 포함 할 수 있습니다.

프로그램은 다음과 같을 수 있습니다.

In [5]: cat > tmpf.py
a = 1

from IPython import embed
embed() # drop into an IPython session.
        # Any variables you define or modify here
        # will not affect program execution

c = 2

^D

이것은 당신이 그것을 실행할 때 일어나는 일입니다 (임의로 기존 ipython 세션 내에서 실행하도록 선택했습니다. 내 경험에서 이와 같이 ipython 세션을 중첩하면 충돌이 발생할 수 있습니다).

In [6]:

In [6]: run tmpf.py
Python 2.7.2 (default, Aug 25 2011, 00:06:33)
Type "copyright", "credits" or "license" for more information.

IPython 0.11 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.

In [1]: who
a       embed

In [2]: a
Out[2]: 1

In [3]:
Do you really want to exit ([y]/n)? y


In [7]: who
a       c       embed

최신 버전의 IPython (> 0.10.2)을 사용하는 경우 다음과 같이 사용할 수 있습니다.

from IPython.core.debugger import Pdb
Pdb().set_trace()

하지만 ipdb를 사용하는 것이 더 낫습니다.


동등한

import pdb; pdb.set_trace()

IPython은 다음과 같습니다.

from IPython.ipapi import make_session; make_session()
from IPython.Debugger import Pdb; Pdb().set_trace()

약간 장황하지만 ipdb가 설치되어 있지 않으면 알아두면 좋습니다. make_session등, 색 구성표를 설정하면 통화가 필요하며, set_trace호출 배치 할 수 있습니다 어디서나 당신은 휴식해야합니다.


일반적으로 ipython을 사용할 때 내부에 "pdb"명령을 사용하여 자동 디버깅을 설정합니다.

그런 다음 스크립트가있는 디렉토리에서 "run myscript.py"명령으로 스크립트를 실행합니다.

예외가 발생하면 ipython은 디버거 내에서 프로그램을 중지합니다. 매직 ipython 명령 (% magic)에 대한 도움말 명령을 확인하십시오.


중단 점을 설정하려는 스크립트에이 한 줄을 간단히 붙여넣고 싶습니다.

__import__('IPython').Debugger.Pdb(color_scheme='Linux').set_trace()

Newer version might use:

__import__('IPython').core.debugger.Pdb(color_scheme='Linux').set_trace()

Looks like modules have been shuffled around a bit recently. On IPython 0.13.1 the following works for me

from IPython.core.debugger import Tracer; breakpoint = Tracer()

breakpoint() # <= wherever you want to set the breakpoint

Though alas, it's all pretty worthless in qtconsole.


Newer versions of IPython provide an easy mechanism for embedding and nesting IPython sessions into any Python programs. You can follow the following recipe to embed IPython sessions:

try:
    get_ipython
except NameError:
    banner=exit_msg=''
else:
    banner = '*** Nested interpreter ***'
    exit_msg = '*** Back in main IPython ***'

# First import the embed function
from IPython.frontend.terminal.embed import InteractiveShellEmbed
# Now create the IPython shell instance. Put ipshell() anywhere in your code
# where you want it to open.
ipshell = InteractiveShellEmbed(banner1=banner, exit_msg=exit_msg)

Then use ipshell() whenever you want to drop into an IPython shell. This will allow you to embed (and even nest) IPython interpreters in your code.


From the IPython docs:

import IPython.ipapi
namespace = dict(
    kissa = 15,
    koira = 16)
IPython.ipapi.launch_new_instance(namespace)

will launch an IPython shell programmatically. Obviously the values in the namespace dict are just dummy values - it might make more sense to use locals() in practice.

Note that you have to hard-code this in; it's not going to work the way pdb does. If that's what you want, DoxaLogos' answer is probably more like what you're looking for.


The fast-and-easy way:

from IPython.Debugger import Tracer
debug = Tracer()

Then just write

debug()

wherever you want to start debugging your program.


I had to google this a couple if times the last few days so adding an answer... sometimes it's nice to be able run a script normally and only drop into ipython/ipdb on errors, without having to put ipdb.set_trace() breakpoints into the code

ipython --pdb -c "%run path/to/my/script.py --with-args here"

(first pip install ipython and pip install ipdb of course)


This is pretty simple:

ipython some_script.py --pdb

It needs iPython installing, usually this works: pip install ipython

I use ipython3 instead of ipython, so I know it's a recent version of Python.

This is simple to remember because you just use iPython instead of python, and add --pdb to the end.

참고URL : https://stackoverflow.com/questions/1126930/is-it-possible-to-go-into-ipython-from-code

반응형