Ipython: توقف بعد تشغيل pdb في خلية ، لا يساعد Kernel / Interrupt

تم إنشاؤها على ٨ مايو ٢٠١٧  ·  34تعليقات  ·  مصدر: ipython/ipython

إذا قمت بتصحيح أخطاء خلية عبر pdb ، فلا تتركها قبل إعادة تشغيل الخلية ، فلن تتمكن من العودة إلى بيئة IPython الخاصة بك. أعد إنتاجه عبر حقيبة اختبار تعليق pdb في دفتر Jupyter . هذه لقطة شاشة:

pdb_resists_kernel_interrupt ipynb

للتسجيل ومحركات البحث ، لتعليق دفتر ملاحظاتك:

  • قم بتشغيل الخلية التالية
  • لا تقم "بإنهاء" عبر موجه PDB
  • ثم قم بتشغيله مرة أخرى.
def test():
    import pdb; pdb.set_trace()  # XXX BREAKPOINT
    return 0

test()

لاحظ أن Kernel / Interupt لا يساعد. يمكنك حفظ دفتر الملاحظات ، ولكن لتشغيل الخلايا مرة أخرى ، تحتاج إلى إعادة تشغيل النواة ، وعند هذه النقطة "ستفقد جميع المتغيرات"

يحدث هذا لي بشكل غير متكرر إذا كنت أبحث من خلال بقية دفتر الملاحظات للحصول على تلميحات حول كيفية تصحيح أخطاء الخلية ، ثم ننسى الإنهاء قبل تغيير الخلية وتشغيلها مرة أخرى. نعم ، يمكنني أن أكون أكثر حرصًا ، لكن الآخرين لديهم نفس التجربة. بفضل wmayner لحالة الاختبار المريحة الموضحة في # 3400.

أقوم بتشغيل دفتر ملاحظات Jupyter 4.3.1 على Python 3.4.3 (افتراضي ، 17 نوفمبر 2016 ، 01:08:31) [GCC 4.8.4]
معلومات Kernel: Python 3.4.3 (افتراضي ، 17 نوفمبر 2016 ، 01:08:31)

الإدخال من takluyver على # 10499

pdb يعمل في نفس العملية ، ونحن نعرف متى يتوقع المدخلات. أعتقد أنه يحتاج إلى شخص ما للقيام بهذا العمل بحيث عند إزالة مربع إدخال HTML في الواجهة الأمامية ، يتم إرسال رسالة مرة أخرى إلى النواة مما يؤدي إلى رفع EOFError.
قد يحتاج ذلك إلى نوع رسالة جديد ، أو يمكننا القيام بذلك كحقل بيانات وصفية في رسالة رد stdin الحالية.

notebook

التعليق الأكثر فائدة

لقد تعرضت للعض من هذا أيضًا. كيف الناس عادة التصحيح في دفتر jupyter؟ استخدام PDB يشبه التلاعب بقنبلة: :(

ال 34 كومينتر

أنا أواجه نفس المشكلة.

بالتأكيد ، نفس الشيء هنا. هذا ألم ملكي في الأجزاء الحساسة إلى حد ما من جسدي. إذا كانت هناك طريقة مناسبة لإيقاف pdb من دون وجود خلية قيد التشغيل ، فيمكن تخفيف ذلك. بدلاً من ذلك ، ستكون طريقة حفظ عملك على الأقل قبل إيقاف تشغيل الكمبيوتر المحمول مهمة (على سبيل المثال ، الشبكة العصبية المدربة وتعطل الكمبيوتر الدفتري عند حفظه بعد 2000 حقبة).

لدي أيضًا هذه المشكلة ، مع إصدار Jupyter 4.30 و Python 3.6.2. يبدو أن إعادة تشغيل النواة هي الطريقة الوحيدة للتعامل مع هذه المشكلة.

لقد فقدت للتو حسابًا لمدة 8 ساعات بسبب هذا ... حان الوقت للبدء من جديد.

لقد فقدت للتو عملية حسابية لمدة 64 ساعة كان من المفترض أن أقدم النتائج بناءً عليها اليوم -. -

لا أحد وجد حلا؟

لقد تعرضت للعض من هذا أيضًا. كيف الناس عادة التصحيح في دفتر jupyter؟ استخدام PDB يشبه التلاعب بقنبلة: :(

من فضلك من فضلك اصلح هذا! أنا أتلقى هذه المشكلة باستمرار.

كذلك هنا. يجب أن تعيد عملية حسابية طويلة جدًا

كذلك هنا.

شخص ما يرجى إصلاحه وسأدفع لك 5 دولارات

zsal إذا كنت جادًا ، يمكنك إضافة هذه المشكلة على https://www.bountysource.com

نفس المشكلة هنا. أحتاج إلى طريقة لمقاطعة عملية سريعة أو عملية "تنتظر" الإدخال واستعادة التحكم ... حتى لو لم يعد بإمكاني الوصول إلى موجه الإدخال.

أنا مبتدئ - كيف يصحح المبرمجون المتقدمون الأخطاء في أجهزة الكمبيوتر المحمولة؟ من المؤكد أنهم لا يستخدمون PDB مع هذه "القنبلة الموقوتة" فيه؟ من فضلك ، شارك أسرارك! :)

+1

+1

+1

+1

فوق!
كانت هذه المشكلة مؤلمة بالنسبة لي لسنوات حتى الآن في كل مرة أستخدم فيها pdb وأنسى التوقف قبل إعادة تشغيل الخلية.

لقد أنشأت مكافأة على BountySource. ربما سيتم إصلاح هذا أخيرًا إذا تمكنا من جمع ما يكفي من المال.
https://www.bountysource.com/issues/44958889-hang-after-running-pdb-in-a-cell-kernel-interrupt-doesn-t-help

+1

+1

لقد دفعني هذا إلى الجنون لسنوات.

ماذا عن استخدام IPython.core.debugger.Pdb بدلاً من ذلك؟

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

(أو يمكن استخدام السحر %debug لتصحيح الأخطاء.)

تشغيل Pdb().set_trace() مرتين له نفس المشكلة.

أنا أحقق في هذا. الطريقة الأساسية لمقاطعات العمل هي أنها (في نظام يونكس) ترسل إشارة إلى العملية ، والتي ترفع بعد ذلك KeyboardInterrupt.

يبدو أن هناك عدة مشكلات مع حدوث ذلك:

  1. لن يقاطع SIGINT zeromq. نأمل أن يتم إصلاح ذلك من خلال https://github.com/zeromq/pyzmq/pull/1368
  2. حتى بمجرد مقاطعة zeromq ، أعتقد أن pdb يحتوي على مجموعة كاملة من كود KeyboardInterrupt-catch الذي يمنعه من الترشيح. قد يكون هذا قابلاً للإصلاح في IPython.core.debugger.Pdb .
  1. ليس دقيقًا ، لا تتم مقاطعة zeromq بواسطة SIGINT وترفع KeyboardInterrupt ، على الأقل ما لم يتم تجاوز معالج SIGINT نفسه.

minrk صحيح وكنت مخطئا ، آسف.

للحصول على هذا الإصلاح ، يجب أن يحدث ما يلي:

شكرا جزيلا للنظر في هذا !!

بمجرد أن يكون هناك إصدار IPykernel جديد ، يمكن إغلاق هذا على أنه ثابت.

منتهي! يمكن إغلاق هذا.

import IPython
import ipykernel
print(IPython.__version__)
print(ipykernel.__version__)
IPython.core.debugger.set_trace()

7.15.0
5.3.0

"" 250 sys.stdout.flush ()
251
-> 252 def __call __ (ذاتي ، نتيجة = لا شيء):
طباعة 253 "" باستخدام إدارة ذاكرة التخزين المؤقت للتاريخ.
254

- لوحة المفاتيح
- لوحة المفاتيح
""

يبدو أن KeyboardInterrupt لا تفعل شيئًا في حالتي. هل هذا هو السلوك المتوقع؟

أتوقع أن يقطع ذلك. سأرى ما إذا كان بإمكاني التكاثر. هذا هو Windows ، أليس كذلك؟

macOS 10.15.5

Python 3.6.2 (default, May  4 2018, 19:40:30)
[GCC 4.2.1 Compatible Apple LLVM 9.1.0 (clang-902.0.39.1)] on darwin

أوه ، لذلك هذا غير متوقع. يُرجى إعلامي إذا كان هناك أي معلومات يمكنني إضافتها للتوضيح.

قائمة النقاط
نسخة الحزمة


أبنوب 0.1.0
Attrs 19.3.0
باك كول 0.2.0
المبيض 3.1.5
ديكور 4.4.2
defusedxml 0.6.0
نقاط الدخول 0.3
ipykernel 5.3.0
ايبثون 7.15.0
إبيثون جينوتيلز 0.2.0
ipywidgets 7.5.1
جيدي 0.17.1
جينجا 2 2.11.2
jsonschema 3.2.0
jupyter 1.0.0
عميل jupyter 6.1.3
jupyter-console 6.1.0
جوبيتر كور 4.6.3
MarkupSafe 1.1.1.1 تحديث
خطأ 0.8.4
nbconvert 5.6.1
nbformat 5.0.7
دفتر 6.0.3
التعبئة والتغليف 20.4
pandocfilters 1.4.2
parso 0.7.0
نتوقع 4.8.0
Pickleshare 0.7.5
نقطة 20.0.2
برنامج Prometheus-client 0.8.0
مجموعة الأدوات السريعة 3.0.5
ptyprocess 0.6.0
Pygments 2.6.1
pyparsing 2.4.7
ثابت 0.16.0
بيثون داتوتيل 2.8.1
pyzmq 19.0.1
qtconsole 4.7.5
QtPy 1.9.0.0 تحديث
Send2Trash 1.5.0.0 تحديث
برنامج setuptools 46.0.0
ستة 1.15.0
Terminado 0.8.3
testpath 0.4.4
تورنادو 6.0.4
السمات 4.3.3
wcwidth 0.2.5
ترميز الويب 0.5.1
عجلة 0.34.2
الحاجيات nbextension 3.5.1 ```

بالنسبة لي استمرت المشكلة أيضًا بعد التحديث. أيضًا في عُقد حساب Linux البعيدة التي أستخدمها للعمل ، انظر:

import IPython
import ipykernel
import os
import platform

print(IPython.__version__)
print(ipykernel.__version__)
print(os.name,platform.system(),platform.release())
IPython.core.debugger.set_trace()

7.15.0
5.3.0
posix Linux 4.19.94-300.el7.x86_64

تعمل حاليًا في بيئة ضخمة جدًا ، لذا لا يمكن استبعاد بعض التبعيات التي قد تسببها؟ يمكنني محاولة معرفة ما إذا كان الخطأ يتكرر أيضًا في بيئة صغيرة إذا كان ذلك مفيدًا؟

هذا يحتاج إلى سيد IPykernel الذي لم يتم إصداره بعد.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات