क्या कोड से ipython में जाना संभव है?


81

मेरी डिबगिंग जरूरतों के लिए, pdbबहुत अच्छा है। हालांकि, अगर मैं अंदर जा सकता हूं , तो यह बहुत कूलर (और सहायक) होगा ipython। क्या यह संभव है?

जवाबों:


112

एक ipdbपरियोजना है जो मानक pdb में iPython को एम्बेड करती है, ताकि आप बस कर सकें:

import ipdb; ipdb.set_trace()

यह सामान्य रूप से इंस्टॉल करने योग्य है pip install ipdb

ipdbबहुत छोटा है, इसलिए easy_installing के बजाय आप ipdb.pyअपने पायथन पथ पर कहीं फ़ाइल भी बना सकते हैं और फ़ाइल में निम्न पेस्ट कर सकते हैं:

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)

Django के साथ आश्चर्यजनक रूप से अच्छी तरह से काम करता है। खैर, इस तथ्य को छोड़कर कि मैं जिस पाठ को टाइप कर रहा हूं, वह नहीं देख सकता, लेकिन यह शायद आसानी से तय हो सकता है (क्योंकि ipdb की केवल छह लाइनें हैं)।
जिओनीज चामिओसोव

4
दरअसल, मुद्दा यह है कि Django रनवेस्टर के लिए एक अलग थ्रेड बनाता है, और किसी भी समय आप एक कोड संपादित करते हैं, यह थ्रेड को रिस्पॉन्स करता है। यह सामान्य रूप से ठीक काम करता है, लेकिन यदि आप पीडीबी में बैठे हैं जब धागा मारा जाता है, तो टर्मिनल पागल हो जाता है। आप इसे रनसर्वर, रननी 'स्टेंट साने' से बाहर निकाल कर ठीक कर सकते हैं, फिर रनसर को फिर से शुरू कर सकते हैं।
जेरेमी डनक

1
@ डैनियल-रोसमैन हाय, मैं मिलता हूं ModuleNotFoundError: No module named 'IPython.Debugger', ModuleNotFoundError: No module named 'IPython.Shell'औरImportError: cannot import name 'ipapi'
सेबमा

1
@memoselyk हाय, मुझे मिलता है ModuleNotFoundError: No module named 'IPython.Debugger', ModuleNotFoundError: No module named 'IPython.Shell'औरImportError: cannot import name 'ipapi'
सेबमा

breakpoint()Ipdb में आने के लिए फंक्शन पाने का एक तरीका है ।
जेरिट

53

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 सत्र में छोड़ने बहुत अच्छा है। आपको बहुत - बहुत धन्यवाद!
जून

1
मैंने मूर्खता से इसे (लगभग अनंत) पाश के अंदर रखा। मैं कभी कैसे बाहर निकल सकता हूं?
गेरिट

2
@gerrit, यदि आप अभी भी वहां हैं तो Ctrl + d दबाएं।
भ्रमित

2
@ conf0000 जो शायद ही अनंत रहा होगा, 6 महीने बाद ;-)
gerrit

1
@gerrit, यदि आप एक एम्बेडिंग लूप में फंस गए हैं: def f() : pass ; IPython.embed = fताकि embed()कॉल एक नॉओप हो, तो Ctrl + D
MatrixManAtYrService

12

यदि आप IPython (> 0.10.2) के अधिक आधुनिक संस्करण का उपयोग कर रहे हैं, तो आप कुछ ऐसा उपयोग कर सकते हैं

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

लेकिन यह शायद केवल ipdb का उपयोग करने के लिए बेहतर है


11

के बराबर

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कॉल रखा जा सकता है कहीं भी आप को तोड़ने की जरूरत है।


8

आम तौर पर, जब मैं ipython का उपयोग करता हूं, तो मैं इसके अंदर "pdb" कमांड के साथ स्वचालित डिबगिंग चालू करता हूं।

फिर मैं अपनी स्क्रिप्ट को उस निर्देशिका में "रन myscript.py" कमांड के साथ चलाता हूं जहां मेरी स्क्रिप्ट स्थित है।

अगर मुझे कोई अपवाद मिलता है, तो ipython डिबगर के अंदर प्रोग्राम को रोक देता है। मैजिक ipython कमांड के लिए हेल्प कमांड देखें (% मैजिक)


तो वहाँ ipython.set_trace () की तरह कुछ लिखने का कोई तरीका नहीं है? :)
जिओ

8

मैं अपनी स्क्रिप्ट में बस इस एक-लाइनर को चिपकाना पसंद करता हूं जहां मैं एक ब्रेकपॉइंट सेट करना चाहता हूं:

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

नए संस्करण का उपयोग कर सकते हैं:

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

6

मॉड्यूल की तरह लग रहा है हाल ही में थोड़ा सा फेरबदल किया गया है। IPython 0.13.1 पर मेरे लिए निम्नलिखित कार्य करता है

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

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

हालांकि, यह qtconsole में बहुत बेकार है


5

IPython के नए संस्करण किसी भी Python प्रोग्राम में IPython सत्र को एम्बेड और नेस्टिंग के लिए एक आसान तंत्र प्रदान करते हैं। आप IPython सत्र को एम्बेड करने के लिए निम्नलिखित नुस्खा का पालन कर सकते हैं :

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)

फिर ipshell()जब भी आप एक आइपियन शेल में गिराना चाहते हैं, का उपयोग करें । यह आपको अपने कोड में IPython दुभाषियों को एम्बेड (और यहां तक ​​कि घोंसला) करने की अनुमति देगा।


3

से IPython डॉक्स :

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

एक IPython शेल प्रोग्रामेटिक रूप से लॉन्च करेगा। जाहिर है कि namespaceतानाशाही में मूल्य सिर्फ डमी मूल्य हैं - यह locals()व्यवहार में उपयोग करने के लिए अधिक समझ में आता है ।

ध्यान दें कि आपको इसे हार्ड-कोड करना होगा; यह काम नहीं pdbकरता है जिस तरह से करता है। यदि आप यही चाहते हैं, तो DoxaLogos का उत्तर संभवतः आपको पसंद करने के लिए अधिक पसंद है।


3

तेज और आसान तरीका:

from IPython.Debugger import Tracer
debug = Tracer()

फिर बस लिखो

debug()

जहाँ भी आप अपना प्रोग्राम डीबग करना शुरू करना चाहते हैं।


1
ImportError: No module named 'IPython.Debugger'अजगर 3.4 /
आईपीथॉन

2

मुझे कुछ समय के लिए ऐसा करने पर एक युगल को गूगल करना पड़ा था, इसलिए एक उत्तर जोड़ना ... कभी-कभी सामान्य रूप से स्क्रिप्ट चलाना और त्रुटियों पर ipython / ipdb में ड्रॉप करना अच्छा होता है, बिना ipdb.set_trace()कोड में ब्रेकपॉइंट लगाए।

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

(प्रथम pip install ipython और pip install ipdbनिश्चित रूप से)


1
धन्यवाद! थोड़ा सा सरल:ipython --pdb -- ./path/to/my/script --with-args here
अलिसियानो

0

यह बहुत आसान है:

ipython some_script.py --pdb

इसे आईफ़ोन स्थापित करने की आवश्यकता है, आमतौर पर यह काम करता है: pip install ipython

मैं ipython के बजाय ipython3 का उपयोग करता हूं, इसलिए मुझे पता है कि यह हाल ही में Python का संस्करण है।

यह याद रखना आसान है क्योंकि आप सिर्फ अजगर की जगह आईफ़ोन का उपयोग करते हैं, और अंत में पीपीपीबी जोड़ते हैं।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.