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


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


76
2017-07-14 17:45


मूल




जवाब:


वहां पर एक ipdb प्रोजेक्ट जो आईपीथन को मानक पीडीबी में एम्बेड करता है, ताकि आप बस ऐसा कर सकें:

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)

106
2017-07-14 18:18



बहुत बढ़िया! यह बहुत अच्छा है! - Geo
Django के साथ आश्चर्यजनक रूप से अच्छी तरह से काम करता है। खैर, इस तथ्य को छोड़कर कि मैं उस पाठ को नहीं देख पा रहा हूं जिसे मैं टाइप कर रहा हूं, लेकिन शायद यह आसानी से ठीक हो सकता है (आईपीडीबी की केवल छह पंक्तियों के बाद से)। - Xiong Chiamiov
दरअसल, मुद्दा यह है कि Django रनरवर के लिए एक अलग थ्रेड फोर्क करता है, और जब भी आप कोड संपादित करते हैं, तो यह धागे को राहत देता है। यह सामान्य रूप से ठीक काम करता है, लेकिन अगर आप पीडीबी में बैठे हैं तो धागे की मौत हो जाती है, टर्मिनल पागल हो जाता है। आप रनरवर, रननीनी 'स्टटी सीन' से तोड़कर इसे फिर से चला सकते हैं, फिर रनरवर फिर से शुरू कर सकते हैं। - Jeremy Dunck
@ डैनियल-रोसमैन हाय, मुझे मिलता है ModuleNotFoundError: No module named 'IPython.Debugger', ModuleNotFoundError: No module named 'IPython.Shell' तथा ImportError: cannot import name 'ipapi' - SebMa
@memoselyk हाय, मुझे मिलता है ModuleNotFoundError: No module named 'IPython.Debugger', ModuleNotFoundError: No module named 'IPython.Shell' तथा ImportError: cannot import name 'ipapi' - SebMa


आईपीथन 0.11 में, आप सीधे इस तरह अपने कोड में आईपीथन को एम्बेड कर सकते हैं

आपका प्रोग्राम इस तरह दिख सकता है

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

यह तब होता है जब आप इसे चलाते हैं (मैंने मनमाने ढंग से इसे मौजूदा आईपीथॉन सत्र में चलाने के लिए चुना है। मेरे अनुभव में इस तरह के नेस्टिंग आईपीथॉन सत्र इसे क्रैश कर सकते हैं)।

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

49
2017-09-14 05:00



यह एक आईपीथन सत्र में छोड़ना बहुत अच्छा है। आपको बहुत - बहुत धन्यवाद! - joon
मैंने मूर्खतापूर्वक इसे एक (लगभग अनंत) लूप के अंदर रखा। मैं कभी कैसे बाहर निकल सकता हूं? - gerrit
@gerrit, अगर आप अभी भी वहां हैं तो Ctrl + d दबाएं। - confused00
@ confused00 यह शायद 6 महीने बाद असीमित हो सकता था ;-) - gerrit
इसका एक फायदा खत्म हो गया है pdb तथा ipdb यह है कि आपके द्वारा चलाए गए कोड के कारण होने वाले किसी भी अपवाद को पूर्ण ट्रेसबैक मिलते हैं (क्योंकि आप पहले से "एक में नहीं हैं)। यह मेरे लिए बहुत उपयोगी है, क्योंकि मेरे पास उपयोग करने की प्रवृत्ति है pdb एक इंटरैक्टिव खोल के लिए चर का एक गुच्छा स्थापित करने के लिए एक तरीका के रूप में। - Xiong Chiamiov


के बराबर

import pdb; pdb.set_trace()

आईपीथॉन के साथ कुछ ऐसा है:

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

यह थोड़ा वर्बोज़ है, लेकिन यह जानना अच्छा है कि आपके पास आईपीडीबी इंस्टॉल नहीं है या नहीं। make_session एक बार रंग योजना, आदि स्थापित करने के लिए कॉल की आवश्यकता होती है, और set_trace कॉल को कहीं भी तोड़ने की जरूरत है जहां आपको तोड़ने की जरूरत है।


11
2017-07-15 00:40





यदि आप आईपीथॉन (> 0.10.2) का एक और आधुनिक संस्करण उपयोग कर रहे हैं तो आप कुछ ऐसा उपयोग कर सकते हैं

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

लेकिन आईपीडीबी का उपयोग करना शायद बेहतर है


11
2017-09-21 10:41





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

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

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


8
2017-07-14 18:08



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


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

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

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

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

8
2017-08-29 11:58





ऐसा लगता है कि हाल ही में मॉड्यूल को चारों ओर घुमाया गया है। IPython 0.13.1 पर मेरे लिए निम्नलिखित काम करता है

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

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

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


6
2018-01-22 17:43





आईपीथॉन के नए संस्करण किसी भी पायथन प्रोग्राम में आईपीथन सत्रों को एम्बेड और घोंसले के लिए एक आसान तंत्र प्रदान करते हैं। आप का पालन कर सकते हैं निम्नलिखित नुस्खा आईपीथॉन सत्र एम्बेड करने के लिए:

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() जब भी आप एक आईपीथन खोल में ड्रॉप करना चाहते हैं। यह आपको आपके कोड में आईपीथन दुभाषियों को एम्बेड करने (और यहां तक ​​कि घोंसला) करने की अनुमति देगा।


4
2018-03-27 17:22





वहाँ से आईपीथन डॉक्स:

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

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

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


3
2017-07-14 18:15