Terminal OS-X berperilaku aneh setelah menjalankan Python secara interaktif

11

Setelah menjalankan python repl (2.7.10) di terminal os-x dan keluar, terminal tidak lagi memasukkan input yang diketik dan beberapa hal aneh lainnya terjadi. Jika saya jalankan pythonlagi dan exit(), maka terminal sepertinya dipulihkan. Saya sekarang hanya menutup tab dan membuka yang baru, jadi saya belum mengujinya secara ekstensif.

Saya kira ini terkait dengan pengaturan terminal, tetapi ini adalah hal yang baru dan saya belum mengubah apa pun yang saya ingat. Python diinstal dengan macports, jika ada hubungannya dengan dependensi yang tidak cocok dengan beberapa perpustakaan konsol. 2.7.10 diinstal beberapa waktu yang lalu, dan ini tidak terjadi setelah instalasi.

Retak buku jari dan terbukaterminal

[~]: virtualenv-2.7 venv-test
[~]: source venv-test/bin/activate
[~]: python
>>> ^D>>>       *(press ctrl-d, the 2nd >>> is strange)
[~]:            *(type something like `ls-l`, nothing shows on console)
[~]: -bash: ls-l: command not found`

Selain itu, jalankan python lagi dan tekan ctrl-dhasil pada output ini:

>>> ^D           (ctrl-d, then hit enter, doesn't exit)
>>> ^D           (...)
>>> ^D           (...)
>>> exit()       (typing exit() quits the session)
>>> [~]: 
Andrew Backer
sumber
Mengapa Anda menginstal Python melalui macports? Python v2.7.10 disertakan dengan El Cap, dan saya pikir Yosemite ... Apakah ada sesuatu yang khusus Anda dapatkan dari Mac Ports?
Benjamin Schollnick
Nah, menggunakan 2.7.apa pun lebih besar dari apa yang dikirimkan bersama mac. Tidak menyentuh sistem python (masalah standar pada unixes), menjalankan 2,7 dengan opsi GIS khusus yang dikompilasi, dengan paket mgmt untuk itu, serta 3,4 pada saat yang sama. Tetapi alasan sebenarnya yang harus Anda lakukan adalah untuk tidak fsck dengan sistem python.
Andrew Backer
Apakah aplikasi python melakukan semacam manajemen jendela? (mis. Menggunakan Kutukan, NCurses, dll)
Benjamin Schollnick
Tidak ada aplikasi, hanya mengetik pythondan kemudianctrl-d
Andrew Backer

Jawaban:

12

Ada bug terbuka di MacPorts tentang masalah ini:

https://trac.macports.org/ticket/48807

Ia mengatakan bahwa menginstal python dengan opsi "+ readline" memperbaiki masalah, yang saya verifikasi dengan melakukannya sendiri.

sudo port uninstall python27
sudo port install python27 +readline
B. Pantai
sumber
9
Sial, terima kasih telah menemukan laporan bug itu. FWIW, Tidak mungkin untuk menghapus instalan python27 (biasanya terlalu banyak paket bergantung padanya), jadi Anda sebaiknya membangun kembali. Lari sudo port selfupdate && sudo port clean python27 && sudo port install python27 +readline. Jika pohon lokal Anda kedaluwarsa, maka tidak akan tersedia varian + readline; yang selfupdateakan memperbaikinya.
Andrew Backer
8

Mode terminal diatur oleh aplikasi Anda ke raw atau cbreak, dan ketika keluar secara tidak normal mode tidak dikembalikan. Secara khusus, fitur yang memetakan Enterkunci (control / M alias carriage return) ke baris baru (control / J alias umpan baris) sering dinonaktifkan dalam kasus ini. Anda dapat memperbaiki masalah dengan pengembalian dengan memasukkan

stty sane

diikuti oleh controlJ

Itu setidaknya akan membiarkan Anda memasukkan perintah lagi, meskipun karakter pengeditan seperti backspacemungkin tidak ditugaskan untuk fungsi mereka yang biasa.

Beberapa mungkin juga menyarankan menggunakan resetperintah, tetapi gejala yang diberikan tidak relevan dengan apa yang program itu lakukan.

Untuk bacaan lebih lanjut

Thomas Dickey
sumber
stty echotampaknya untuk memperbaiki masalah ( stackoverflow.com/questions/32475928/python3-messes-up-terminal ). Tidak yakin apakah itu mengurus semuanya. Saya pikir sesuatu yang sedikit salah dengan python saya, karena kesalahan sintaks mengharuskan saya untuk secara manual menekan baris baru untuk mulai memasukkan perintah baru, dan seharusnya tidak seperti itu.
Andrew Backer
Meskipun ini tidak memperbaiki masalah, setidaknya memungkinkan saya untuk memperbaikinya setelah fakta. Itu cukup baik untukku, untuk saat ini. Jika ada cara untuk mencari tahu mengapa ini terjadi, saya ingin tahu.
Andrew Backer