Spyder: Tidak dapat melihat plot yang dibuat dengan Matplotlib saat debugging

Dibuat pada 17 Feb 2015  ·  47Komentar  ·  Sumber: spyder-ide/spyder

_Dari al.dan ... @ gmail.com pada 2011-04-12T17: 33: 50Z_

Skrip ini, ketika dijalankan dalam spyder, berfungsi dengan baik dan menghasilkan plot kontur:

#! / usr / bin / env python
dari matplotlib.pyplot import imshow, show
impor numpy sebagai np
x = np.random.rand (4,5)
imshow (x)
menunjukkan()

Namun, jika saya memasuki mode debug dan meletakkan breakpoint pada baris imshow (x) kemudian secara manual mengetik perintah imshow (x) dan show () pada prompt (Pdb), tidak ada plot yang muncul. Saya hanya mendapatkan referensi ke objek plot:

(Pdb) imshow (x)

(Pdb) acara ()
(Pdb)

Akan menjadi peningkatan yang bagus untuk dapat memplot variabel dalam mode debug.

Python 2.7.1
NumPy 1.5.1
matplotlib 1.0.1 (bagian belakang WXAgg)
RHEL 4,8 x86_64

_Masalah asli: http://code.google.com/p/spyderlib/issues/detail?id=620_

11–20 stars Debugger Bug

Komentar yang paling membantu

Lihat https://github.com/matplotlib/matplotlib/pull/4779 untuk detailnya yang mengerikan.

Versi yang sangat singkat, agar GUI menjadi responsif, event loopnya (yang pada dasarnya adalah loop tak terbatas yang menunggu pengguna I / O) perlu dijalankan. Prompt debug juga berada dalam loop tak terbatas menunggu pengguna mengetik. Pada prompt 'normal' ada beberapa pekerjaan integrasi yang rumit yang dilakukan untuk membiarkan kedua loop ini berbagi (pada dasarnya, prompt memungkinkan loop GUI berjalan hingga satu tombol dipukul, memproses tombol, dan kemudian memulai ulang loop peristiwa GUI). Pada prompt debugging, integrasi ini tidak selesai dan angka tersebut tampak 'mati'. Ini akan mempengaruhi jendela berbasis GUI.

Alasan memanggil plt.pause() works adalah karena secara eksplisit menjalankan loop peristiwa GUI selama beberapa detik.

Backend sebaris berfungsi karena hanya menghasilkan png statis (jadi _selalu_ 'mati').

Semua 47 komentar

_Dari al.dan ... @ gmail.com pada 2011-04-12T15: 40: 57Z_

Lupa menambahkan bahwa ini dengan spyder 2.0.8 dan ipython 0.10.1.
Juga, backend saat spyder berjalan adalah Qt4Agg. Saya mendapatkan WXAgg ketika saya menjalankan ipython langsung dari jendela terminal (yaitu, secara independen dari spyder).

_Dari ccordoba12 pada 2011-05-15T19: 31: 44Z_

Label: Cat-Debugger

_Dari ccordoba12 pada 2011-08-16T11: 41: 02Z_

masalah # 733 telah digabungkan ke dalam masalah ini.

_Dari eigenjoh ... @ gmail.com pada 2011-11-10T07: 23: 21Z_

perbaikan ini akan membuat aplikasi ini menjadi matlab killer

_Dari kavaldj ... @ gmail.com pada 2013-05-12T21: 43: 03Z_

Apakah ini telah diperbaiki atau ditangani?

Saya setuju dengan komentar #4 : ini akan membuat Spyder lebih dekat dengan pembunuh ML

_Dari contrebasse 2013-05-13T00: 37: 52Z_

1: ini normal, backend defalut untuk matplotlib adalah WXAgg. Anda dapat mengubahnya di skrip Anda:

impor matplotlib
matplotlib.use ('Qt4Agg', warn = False)

_From jed.lud ... @ gmail.com pada 2013-05-13T07: 45: 45Z_

Diagnostik terbaru tambahan setelah melakukan sedikit lebih banyak pengujian:

  • Plotting gagal saat debugging di dalam Spyder ketika skrip dijalankan di dalam sesi Python interaktif saat ini atau sesi IPython interaktif. Ini berlaku untuk backend Qt4Agg atau WXAgg.
  • Plotting selama debugging berfungsi dengan baik di dalam Spyder jika skrip diatur untuk dieksekusi dalam interpreter Python khusus. Ini juga tidak tergantung pada backend.
  • Membuat plot selama debugging berfungsi dengan baik dari sesi "ipython qtconsole" saat dijalankan di konsol sistem.

Soyder 2.3.0dev (revisi 0bb65fdb4b6e)
Python 2.7.3 32-bit
IPython 0.13.2
Matplotlib 1.2.0
Windows 7 (64-bit)

_Dari kavaldj ... @ gmail.com pada 2013-05-14T13: 45: 31Z_

8 Jed, terima kasih !!

Menjalankan debug di penerjemah khusus berfungsi untuk saya, terima kasih atas petunjuk yang bagus!

Saya minta maaf jika saya tampak serakah, tetapi adakah cara sederhana untuk menjadikan sosok itu non-modal?

Sekarang ini memblokir penerjemah karena dihentikan di Pdb, mungkin ada trik lain yang dapat saya gunakan? Saya hanya memanggil imshow (data), show ().

Terima kasih banyak sebelumnya!
dan

_From jed.lud ... @ gmail.com pada 2013-05-14T16: 55: 16Z_

@ -kavaldijiev: Membuat angka sebagai non-modal adalah bagian yang sulit dipecahkan. Sepertinya Carlos berusaha memecahkan masalah ini di bawah masalah # 733, dan ini mungkin tidak mudah tanpa beberapa thread yang menarik. Ini mungkin ada hubungannya dengan mode interaktif matplotlib yang harus berjalan secara paralel dengan pdb, dan Anda harus mencari cara agar utas tersebut bekerja sama.

Perhatikan bahwa jika Anda mencoba untuk merencanakan selama debugging di IPython Qt Console, itu juga memblokir, setelah Anda mengeluarkan perintah "show ()". Di sana juga tidak sepenuhnya interaktif.

Menjalankan penerjemah khusus sepertinya merupakan solusi terbaik untuk saat ini.

_Dari kavaldj ... @ gmail.com pada 2013-05-15T14: 54: 57Z_

@ -jed Terima kasih atas penjelasan detailnya!

Saya akan mengelola dengan figur modal. Tapi itu pasti layak membuatnya bekerja dalam jangka panjang, itu bisa sangat menarik bagi kerumunan MATLAB.

_From jed.lud ... @ gmail.com pada 2013-05-16T07: 57: 29Z_

@ -kavaldijiev: Setelah penyelidikan lebih lanjut, ada solusi lain yang akan memberi Anda cara untuk merencanakan secara interaktif saat men-debug. Tampaknya itu mungkin komponen Qt GUI yang menghalangi plot interaktif. Jika Anda menjalankan IPython _without_ antarmuka konsol Qt, plotting interaktif bekerja saat debugging _without_ memblokir. Berikut perintahnya:

  1. Buka Command Prompt dan cd ke direktori tempat skrip Anda berada.
  2. Jalankan "ipython --pylab" saat diminta.
  3. Di dalam IPython, jalankan "% run -d.py "
  4. Sekarang Anda dapat menelusuri kode menggunakan perintah pdb, membuat plot menggunakan imshow (), dan plot harus menggambar tanpa memblokir input baris perintah.

_From jed.lud ... @ gmail.com pada 2013-05-16T15: 11: 32Z_

Dan, setelah sedikit penelitian lebih lanjut, saya menemukan jawaban ini: http://stackoverflow.com/questions/12822762/pylab-ion-in-python-2-matplotlib-1-1-1-and-updating-of-the -plot-while-the-pro / 12826273 # 12826273 Jadi, jika kode pada postingan asli diubah dengan cara ini:

dari matplotlib.pyplot import imshow, pause
impor numpy sebagai np
x = np.random.rand (4,5)
imshow (x)
jeda (1)

Anda bisa mendapatkan plot untuk memperbarui, secara interaktif, di dalam konsol interaktif Spyder selama debugging tanpa memblokir! Jadi, gunakan pause (1) sebagai ganti show (). Plot hanya menjadi interaktif untuk durasi jeda, jadi jika Anda ingin lebih banyak waktu untuk memperbesar atau menggeser data, gunakan jeda (10) atau jeda (20). Bekerja di Konsol Qt IPython juga.

_Dari kavaldj ... @ gmail.com pada 2013-05-16T22: 35: 04Z_

@ -jed, terima kasih, kedua metode berhasil!

Metode command prompt tampak lebih kuat - Saya bisa menutup gambar yang dibuka, dan gambar bisa mendapatkan fokus (untuk zoom, dll) hingga ditutup.

Metode jeda jelas lebih disukai karena ada di dalam Spyder. Jeda mengembalikan kontrol keyboard, tetapi jendelanya tidak boleh ditutup, jika tidak penerjemah akan berhenti. Membuka lebih banyak gambar baru goyah - terkadang berhasil, di lain waktu tidak, tetapi saya tidak menghabiskan banyak waktu untuk menguji.

Bagaimanapun, semua itu sangat berguna untuk debugging, bahkan tidak semudah dan sekuat ML.

Bersulang,
dan

_Dari al.dan ... @ gmail.com pada 2013-05-19T21: 08: 30Z_

Senang melihat kemajuan setelah beberapa tahun. Ya, trik jeda (n) bekerja dengan baik untuk saya. Terima kasih, @ -jed, telah menindaklanjuti solusi!

_From jed.lud ... @ gmail.com pada 2013-05-20T09: 13: 28Z_

Saya tidak bisa mengambil banyak pujian untuk apa pun selain penyelidikan. Fungsi jeda (n) adalah fitur matplotlib yang kebetulan saya temukan.

Pada akhirnya, akar dari masalah ini sebenarnya adalah interaksi antara loop peristiwa menggambar matplotlib dan loop peristiwa aplikasi Qt, dan saya tidak yakin benar-benar ada solusi "Spyder" untuk itu. Ini mungkin harus dialamatkan di tingkat matplotlib. Sebagai bukti, IPython yang berjalan di konsol Qt mengalami keterbatasan yang sama.

_Dari jason.bo ... @ gmail.com pada 07-07 2014T05: 33: 04Z_

Masalah ini tampaknya telah diselesaikan di IEP: https://bitbucket.org/iep-project/iep/issue/297/interactive-plotting-is-not-working-during

_Dari ccordoba12 pada 07-07

masalah # 1848 telah digabungkan ke dalam masalah ini.

Saya hanya ingin tahu apakah seseorang bisa memberi saya sedikit perspektif tentang ke mana kita akan menuju dengan semua ini. Saya curiga bahwa saya bukan satu-satunya di luar sana yang telah menghabiskan banyak waktu menggunakan Matlab dan sangat tertarik dengan dunia Python karena berbagai alasan dan perasaan bahwa produktivitas sebenarnya sangat dekat tetapi seperti fatamorgana yang tampaknya selalu keluar. dari jangkauan. Solusi pause () sangat bagus dan respons tim Spyder benar-benar mengesankan. Dan sekarang karena masalah editor lambat di El Capitan tampaknya telah dihentikan dalam versi 3.0 beta, semuanya tampak _sangat dekat_. Dan lagi ...

Jadi, menurut ahli, ke mana tujuan semua ini? Dari apa yang bisa saya kumpulkan, sebagian besar masalahnya adalah Matplotlib itu sendiri. Dan saya juga menyimpulkan bahwa guiqwt bukanlah bentuk yang bagus sekarang juga. Jadi, apakah orang berpikir bahwa kita sedang menuju situasi di mana kita dapat men-debug di IDE, mencapai breakpoints, dan melakukan plotting interaktif dari breakpoints, semuanya berjalan mulus? Saya pikir itulah yang diinginkan semua mantan pengguna Matlab, dan beberapa dari kita bertanya-tanya apakah kita harus menaikkan $ 200 untuk Matlab Home Edition, kembali ke The Borg dan menjauh dari pendekatan Python dan daya tarik perangkat lunak berbasis komunitas dan Bahasa Python.

Ini mungkin terdengar seperti saya mengeluh, tetapi saya sebenarnya hanya mencoba mencari cara untuk menginvestasikan waktu saya. Saya sangat ingin cara Python menjadi pembunuh Matlab adalah ...

@jandyman , jangan putus asa :-) Kami telah melakukan reorganisasi / pembersihan besar-besaran untuk Spyder 3.0 yang akan sangat bermanfaat untuk Spyder 4.0, di mana kami berencana untuk menyelesaikan masalah ini.

Masalah sebenarnya bukan dengan Matplotlib, itu dengan arsitektur IPython / Jupyter yang memblokir konsol saat melakukan debugging, mencegah kami menjalankan sesi debugging yang lebih berfitur (dengan riwayat penelusuran dan plot) seperti di Matlab.

Tetapi izinkan saya meyakinkan Anda bahwa setelah 3.0 dirilis (dalam satu bulan atau lebih), semua upaya kami akan diarahkan untuk menyelesaikan banyak masalah debugging yang luar biasa dan sangat menjengkelkan yang dimiliki Spyder. Jika semuanya berjalan dengan baik dan kami berhasil, kami berencana untuk merilis perbaikan kami di 4.0 (seperti yang saya katakan) pada akhir tahun, atau di awal tahun berikutnya :-)

Saya juga menyimpulkan bahwa guiqwt tidak dalam kondisi bagus sekarang

Itu adalah proyek @PierreRaybaut (orang yang sama yang membuat Spyder). Sayangnya dia tidak punya banyak waktu untuk open source belakangan ini :-(

Saya juga menyimpulkan bahwa guiqwt tidak dalam kondisi bagus sekarang

Itu adalah proyek @PierreRaybaut (orang yang sama yang membuat Spyder). Sayangnya dia tidak punya banyak waktu untuk open source belakangan ini :-(

@ ccordoba12 , @jandyman : Sayangnya, itu benar.
Namun, saya melakukan beberapa pekerjaan penting baru-baru ini di guiqwt: Saya telah memecahkan masalah keusangan PyQwt dengan mengimplementasikannya kembali dengan Python murni (lihat proyek PythonQwt ) sehingga guiqwt v3 tidak bergantung pada PyQwt lagi. Saya tidak berpikir bahwa guiqwt dalam kondisi yang buruk saat ini: berkat perkembangan terkini, ia bekerja pada Python 2.7, 3.0-3.5 dan dengan Qt4-Qt5. Tetapi proyek ini tidak berkembang, karena saya tidak punya waktu untuk mengelolanya (misalnya membuat fitur baru, mempromosikan perpustakaan, dll.) - Saya hanya melakukan pemeliharaan, sehingga fitur saat ini terus berfungsi seperti sebelumnya. Karena itu, perhatikan bahwa itu masih jauh, jauh lebih berkinerja daripada matplotlib (atau MATLAB) untuk menampilkan dan memanipulasi gambar besar secara real-time (zomming / panning, menyesuaikan kontras, merencanakan penampang, dll.) Misalnya, dan itu a jauh di depan matplotlib tentang interaktivitas.

Mengenai kiriman asli oleh @ ccordoba12 , Spyder sekarang mengandalkan IPython / Jupyter: ini adalah hal yang hebat karena mengaktifkan banyak fitur baru tetapi juga memiliki kekurangan.
Bagaimanapun, saya tidak melihat mengapa tidak mungkin untuk berinteraksi dengan cara yang sama di Spyder daripada di MATLAB.

Halo semuanya,

Saya salah satu pengguna yang telah beralih dari MATLAB ke Python. Saya pikir Spyder adalah IDE yang hebat, tetapi masalah tidak adanya plot interaktif saat debugging adalah kelemahan penting bagi orang-orang yang berasal dari MATLAB.

Saya pikir seharusnya tidak terlalu sulit untuk menyelesaikannya. Misalnya, saya menjalankan IPython dari terminal sistem (tanpa qtConsole), dan saya dapat melakukan plot interaktif (guiqwt) dengan sempurna, baik dari sesi IPython, atau ipdb. Juga, saya memiliki riwayat perintah saat debugging. Saya pikir jika Anda hanya mengganti (atau menambahkan opsi) menjalankan ipython dari terminal (tidak ada qtConsole), masalah ini akan terpecahkan.

Tolong, coba perbaiki ini, karena saya pikir ini adalah satu-satunya hal yang menghentikan banyak orang menggunakan Spyder.

Terima kasih,

Felipe

Saya pikir seharusnya tidak terlalu sulit untuk menyelesaikannya.

Ini. Perpustakaan dan teknologi yang digunakan oleh IPython di terminal, dan qtconsole sama sekali berbeda.

Bukan untuk apa pun bug ini telah dibuka selama 5 tahun, dan masih akan ada untuk beberapa waktu lagi ;-)

Saya memerlukan fitur ini karena saya menggunakan Spyder sebagai IDE utama untuk mengembangkan algoritme pemrosesan gambar, melihat gambar saat debugging adalah permintaan fitur yang sangat umum.

Saya juga menyukainya, saya menggunakan Spyder terutama untuk debugging.

@mmagnuski , ini mungkin sekarang dengan menggunakan sihir %plot saat debugging, seperti ini

%plot plt.plot(range(10))

Tetapi agar ini berfungsi, Anda perlu mengatur backend Matplotlib Anda ke Inline .

@tacaswell Saya sedang mengobrol dengan @WeatherGod dan dia pikir Anda mungkin bisa ikut serta.

Akan keren jika ini bekerja "dengan mulus" meskipun saya mengerti itu sulit.

Untuk saat ini, saya menggunakan trik pause(10) .

Lihat https://github.com/matplotlib/matplotlib/pull/4779 untuk detailnya yang mengerikan.

Versi yang sangat singkat, agar GUI menjadi responsif, event loopnya (yang pada dasarnya adalah loop tak terbatas yang menunggu pengguna I / O) perlu dijalankan. Prompt debug juga berada dalam loop tak terbatas menunggu pengguna mengetik. Pada prompt 'normal' ada beberapa pekerjaan integrasi yang rumit yang dilakukan untuk membiarkan kedua loop ini berbagi (pada dasarnya, prompt memungkinkan loop GUI berjalan hingga satu tombol dipukul, memproses tombol, dan kemudian memulai ulang loop peristiwa GUI). Pada prompt debugging, integrasi ini tidak selesai dan angka tersebut tampak 'mati'. Ini akan mempengaruhi jendela berbasis GUI.

Alasan memanggil plt.pause() works adalah karena secara eksplisit menjalankan loop peristiwa GUI selama beberapa detik.

Backend sebaris berfungsi karena hanya menghasilkan png statis (jadi _selalu_ 'mati').

Terima kasih atas penjelasannya dan masalah terkait Thomas!

PR ini akan menyelesaikannya saya pikir: https://github.com/ipython/ipykernel/pull/438

Kerja bagus! Terima kasih banyak @ impact27!

Ada solusi untuk ini? Saya tidak bisa menutup angka setelah plt.pause (1). Saya mencoba plt.close () dan berhenti lagi tetapi n berhasil. Terima kasih

Ada solusi untuk ini? Saya tidak bisa menutup angka setelah plt.pause (1). Saya mencoba plt.close () dan berhenti lagi tetapi n berhasil. Terima kasih

Anda harus memberikan angka angka sebagai argumen untuk plt.close() (atau 'all' ). Solusi untuk saat ini adalah plt.pause . Ini akan diselesaikan ketika / jika ipykernel menggabungkan https://github.com/ipython/ipykernel/pull/438. Saya pribadi menggunakan versi modifikasi dari ipykernel dengan cabang ini digabungkan.

Ada solusi untuk ini? Saya tidak bisa menutup angka setelah plt.pause (1). Saya mencoba plt.close () dan berhenti lagi tetapi n berhasil. Terima kasih

Anda harus memberikan angka angka sebagai argumen untuk plt.close() (atau 'all' ). Solusi untuk saat ini adalah plt.pause . Ini akan diselesaikan ketika / jika ipykernel menggabungkan ipython / ipykernel # 438 . Saya pribadi menggunakan versi modifikasi dari ipykernel dengan cabang ini digabungkan.

Tidak berhasil. Saya menjalankan plt.figure (1); plt.imshow (myimage); plt.pause (1); plt.close (1) dan tidak ada hasil. Saya menggunakan IPython 7.11.1, Spyder 4.0.1 dan python 3.7.5

Saya bisa mereproduksi. Silakan buka masalah baru tentang itu. Sebagai solusinya Anda dapat menutupnya dengan tanda silang saat di bawah plt.pause

Saya bisa mereproduksi. Silakan buka masalah baru tentang itu. Sebagai solusinya Anda dapat menutupnya dengan tanda silang saat di bawah plt.pause

Solusi ini berhasil. Itu aneh. Terima kasih

Ini bukan hanya masalah saat debugging. Saya telah mengaktifkan backend sebaris. Inilah contoh kerja minimal:

import numpy as np
import matplotlib.pyplot as plt

x, y = np.random.rand(2, 5)

fig = plt.figure()

ax = fig.add_subplot(111)

ax.scatter(x, y)

Jika saya "Menjalankan file" pada contoh, plot sebaris akan muncul. Jika saya memilih keseluruhan contoh dan "Jalankan pilihan atau baris saat ini", plot sebaris akan muncul. Jika saya memilih baris 1-6 dan "Jalankan pilihan atau baris saat ini", dan mengetikkan sisa contoh di konsol, tidak ada plot yang muncul. Referensi ke objek plot memang muncul.

Ini bukan hanya masalah saat debugging. Saya telah mengaktifkan backend sebaris. Inilah contoh kerja minimal:

import numpy as np
import matplotlib.pyplot as plt

x, y = np.random.rand(2, 5)

fig = plt.figure()

ax = fig.add_subplot(111)

ax.scatter(x, y)

Jika saya "Menjalankan file" pada contoh, plot sebaris akan muncul. Jika saya memilih keseluruhan contoh dan "Jalankan pilihan atau baris saat ini", plot sebaris akan muncul. Jika saya memilih baris 1-6 dan "Jalankan pilihan atau baris saat ini", dan mengetikkan sisa contoh di konsol, tidak ada plot yang muncul. Referensi ke objek plot memang muncul.

Saya tidak berpikir ini terkait dengan bug ini. Ini adalah salah satu batasan dalam menggunakan ujung belakang sebaris yang plotnya tidak "digambar ulang" sendiri. Jika Anda perlu memplot sesuatu secara eksplisit di back-end sebaris, Anda dapat melakukan:

from IPython.core.display import display
display(fig)

display(fig) bekerja. Namun, perilaku yang tidak konsisten antara menjalankan file sepenuhnya dan menjalankan file sebagian dan menyelesaikannya di konsol membingungkan.

@kdpenner - Anda akan mendapatkan perilaku yang sama misalnya di buku catatan jika Anda memisahkan kode antar sel, hal ini diharapkan. Tapi saya rasa Anda tidak perlu menggunakan fungsi display() untuk ini. Mengetik fig di konsol akan menggambar angka.

fig juga berfungsi. Mungkin perbedaan perilaku ini dirancang, tetapi bukan itu yang saya harapkan, sebagai pengguna.

@kdpenner Yang saya maksud adalah bahwa Anda akan mendapatkan perilaku yang sama di lingkungan lain dengan backend inline jadi ini bukan masalah dengan Spyder.

@mmagnuski Dipahami. Terima kasih atas solusi fig .

🎉

Terima kasih banyak telah memperbaiki ini!

seru!

Anda dapat membaca tentang ini dan peningkatan lainnya pada debugger kami yang ada di versi 4.2.0 di sini .

Apakah halaman ini membantu?
0 / 5 - 0 peringkat