Bagaimana cara kerja pasta% ajaib IPython?

94

Saya ingin menyalin kode Python / seluruh fungsi dan kelas yang sudah menjorok ke dalam IPython. Setiap kali saya mencoba lekukannya kacau dan saya mendapatkan pesan kesalahan berikut:

IndentationError: unindent does not match any outer indentation level (<ipython-input-23-354f8c8be51b>, line 12)

If you want to paste code into IPython, try the %paste and %cpaste magic functions.

Framester
sumber
3
Saya tahu, itu mungkin sudah di stackoverflow, tetapi tidak menemukannya setelah 3 pencarian, jadi saya menambahkan versi saya sendiri.
Framester

Jawaban:

137

Anda tidak dapat menyalin ke IPython secara langsung. Ini langkah-langkahnya:

  1. Salin baris yang ingin Anda salin ke IPython ke clipboard
  2. Masuk %pasteke IPython
  3. Tekan enter
  4. Keuntungan!
Framester
sumber
47
% paste membutuhkan Tkinter, jadi jika Anda tidak memilikinya, taruhan bagus lainnya adalah% cpaste
yekta
61
Anda sebenarnya dapat menyalin kode ke IPython secara langsung: Anda mungkin harus menonaktifkan indentasi otomatis terlebih dahulu dengan memasukkan %autoindent.
Eric O Lebigot
Terima kasih EOL! +1 untuk Anda
Framester
5
Di Ipython 5 Anda bisa menempelkan kode. Tidak perlu %pastelagi. Baca jawaban ini .
Levon
1
Anda juga tidak membutuhkan% sebelumnya paste.
kata
40

Klarifikasi tentang langkah-langkah:

  • Pertama, salin baris target ke clipboard Anda.

  • Ketik ke prompt iPython:

    • Jika di Tkinter: masuk %paste
    • Jika tidak: masuk %cpaste
  • Tempel (Ctrl-V) dan tekan enter.

  • Lalu ketik -- dan tekan enter.

Sebagai contoh:

In [1]: %cpaste
Pasting code; enter '--' alone on the line to stop or use Ctrl-D.
:for l in "Hello World":
:    print l,
:--
H e l l o   W o r l d
Yuly
sumber
3
Anda tidak perlu Ctrl-V. Hanya ketik% paste dan tekan enter.
SeF
21

Pada Ipython 5 Anda tidak memerlukan perintah ajaib apa pun, cukup tempelkan

ipython5

Berkat prompt_toolkit, IPythonsekarang mendukung:

  • Penyorotan sintaks saat Anda mengetik
  • Pengeditan multi-baris nyata (tombol panah atas dan bawah berpindah antar baris)
  • Tempel multi-baris tanpa merusak indentasi atau langsung menjalankan kode
  • Antarmuka penyelesaian kode yang lebih baik (kami berencana untuk meningkatkannya lagi) Dukungan mouse opsional

Lebih lanjut tentang ini di sini

Untuk meningkatkan ipythonke versi terbaru

pip install ipython --upgrade 
Levon
sumber
Apakah mungkin untuk menempelkan banyak baris dan menjalankan kode secara otomatis di setiap baris?
Eric Duminil
ya, cukup paste kodenya dan tekan enter. jika Anda ingin men-debug periksa% pdb atau ipdb. contoh
Levon
Ini juga mendukung keluaran repl Python, kode yang dimulai dengan tiga >tanda seperti ini:>>> a = 1 + 2
Flimm
Selama ini saya melakukan% cpaste .. nice!
Gershon Herczeg
1
Saya pikir itu tergantung pada lingkungan tempat Anda melakukan penempelan dan cara Anda melakukan penempelan? Rekan saya menggunakan command prompt Windows 10 untuk SSH ke host Linux kami, membuka ipython di wadah Docker di sana dan mencoba menempelkan kode yang sudah diindentasi (dengan mengklik kanan ), dan dia mendapat lekukan ekstra bahkan di iPython 7.8.0. Cara saya memahami perilaku klik kanan command prompt adalah bahwa ia sebenarnya hanya mengambil apa pun yang ada di clipboard dan mengeluarkannya karakter demi karakter seolah-olah Anda sedang mengetiknya. Jadi iPython tidak tahu bahwa Anda sebenarnya menempel.
Kal
6

%paste membutuhkan Tkinter. Jika Anda menggunakan ubuntu, Anda dapat menginstalnya dengan

sudo apt-get install python-tk

Jika Anda menggunakan Python3

sudo apt-get install python3-tk

Kemudian restart ipython dan gunakan %pasteuntuk menempelkan dari clipboard Anda.

ChillarAnand
sumber
1

Salah satu jawaban yang berguna hilang di komentar, jadi ingin mengulanginya bersama dengan menambahkan referensi untuk fungsi ajaib IPython yang berguna.

Pertama untuk menyatakan kembali apa yang dikatakan @EOL, salah satu cara untuk menyelesaikan masalah OP adalah mematikan indentasi otomatis dengan terlebih dahulu menjalankan %autoindentdan melakukan paste (tidak diperlukan jika Anda menggunakan %paste, tentu saja).

Sekarang untuk menambahkan lebih banyak informasi ke apa yang sudah ada di sini, satu lagi mode yang berguna di IPython %doctest_modeyang memungkinkan Anda untuk menyalin contoh tempel dan menguji cuplikan dari string dokumen. Ini juga berguna untuk menjalankan keluaran sesi python interaktif yang dapat Anda temukan di dokumentasi dan forum online, tanpa harus terlebih dahulu menghapus string prompt.

haridsv
sumber
1

Untuk pengguna ubuntu yang menggunakan Python 3.

Itu python-tkuntuk Python 2.

Untuk membuat %pastePython 3 bekerja, instal python3-tkpaket:

sudo apt-get install python3-tk
utapyngo.dll
sumber