GNU/Linux >> Belajar Linux >  >> Linux

Python dalam mode mentah stdin print menambahkan spasi

Sepertinya Anda hanya melakukan line feed tetapi tidak ada carriage return. Ubah cetakan Anda menjadi

print("ASD", end="\r\n")

Masalah yang Anda alami adalah perbedaan antara mode 'mentah', 'dimasak', dan 'cbreak'. Dan mode ini adalah mode driver terminal tingkat kernel, bukan mode kode aplikasi Anda atau perpustakaan standar atau apa pun di ruang pengguna. Ini adalah cara Unix jadul untuk merujuk pada ini. Posix telah menggantinya dengan serangkaian atribut yang jauh lebih halus, meskipun atribut Posix biasanya dibalik bersamaan dengan fungsi pembantu dengan cara yang meniru mode 'mentah', 'dimasak', dan 'cbreak' yang lama.

Dalam mode matang, driver terminal itu sendiri memiliki fungsionalitas pengeditan garis primitif bawaan. Ini menangani backspace, penghapusan kata (pada dasarnya backspace seluruh kata sekaligus) dan hal serupa. Tidak ada yang canggih seperti menangani tombol panah atau riwayat atau semacamnya. Sangat primitif. Dalam mode ini, program Anda tidak pernah melihat apa pun dari terminal hingga karakter end-of-line (eol) dikirim, dan kemudian program Anda mendapatkan seluruh baris, dan akhir baris diterjemahkan ke standar Unix \n terlepas dari apa yang sebenarnya dilakukan terminal. Juga, sebagai bagian dari ini, driver terminal menggemakan kembali karakter yang diketik ke terminal sehingga pengguna dapat melihat apa yang mereka ketikkan.

Dalam mode 'dimasak', driver terminal tingkat kernel juga melakukan beberapa terjemahan keluaran. Dan bagian dari itu adalah mengubah \n ke dalam \r\n jika diperlukan.

Juga, dalam mode 'dimasak', driver terminal menangani karakter khusus seperti Control-C (mengirim SIGINT ke grup proses pengendalian (diterjemahkan oleh CPython menjadi pengecualian KeyboardInterrupt)) dan Control-Z (mengirim SIGTSTP (seperti SIGSTOP, tetapi dapat ditangkap) ke grup proses pengontrolan).

Dalam mode 'cbreak', pengeditan baris tidak lagi dilakukan. Pengemudi terminal memberikan setiap karakter (atau urutan karakter pendek, seperti urutan keluar untuk tombol panah) ke program dengan segera. Karakter ini tidak digaungkan ke layar, jadi kecuali program Anda kemudian mencetaknya, pengguna tidak akan melihatnya. Driver terminal masih menangani karakter khusus seperti Control-C dan Control-Z, meskipun ia berhenti menangani karakter pengeditan garis seperti backspace atau karakter penghapus kata (biasanya Control-W). Selain itu, beberapa pemrosesan output masih dilakukan, sehingga driver mengubah \n menjadi \r\n .

Dalam mode 'mentah', tidak ada pemrosesan yang dilakukan pada input atau output. Tidak ada penanganan karakter khusus, tidak ada gema, tidak ada transformasi \n ke dalam \r\n , tidak ada penanganan untuk Control-Z, tidak ada. Terserah program yang menempatkan terminal dalam mode mentah untuk melakukan semuanya.

Sekarang, Anda menyetel atribut untuk sys.stdin jadi Anda mungkin berpikir ini seharusnya tidak memengaruhi sys.stdout . Namun, pada kenyataannya, kedua deskriptor file Anda mengarah ke 'contoh' yang sama persis dari driver terminal. Dan pengaturan untuk driver terminallah yang menentukan apa yang terjadi. Jadi tidak masalah jika Anda mengubah pengaturan tersebut melalui sys.stdin , sys.stdout , atau bahkan sys.stderr , semua mengubah instance driver terminal dasar yang sama dan memengaruhi yang lainnya.

Ini, tentu saja, tidak berlaku untuk deskriptor file yang telah dialihkan oleh shell sebelum program Anda diluncurkan.

Sebagai catatan tambahan, Anda dapat menggunakan stty -a pada baris perintah untuk melihat pembacaan penuh dari semua flag ini (termasuk karakter kontrol mana yang menghasilkan sinyal dalam mode masak dan cbreak).


Google membawa saya ke sini ketika saya sedang mencari jawaban untuk pertanyaan yang sama ini. Petunjuk yang dibagikan oleh halex of no carriage return membantu pencarian saya akan kebenaran. Saya menemukan jawaban saya di posting di Chris's Wiki:https://utcc.utoronto.ca/~cks/space/blog/unix/CBreakAndRaw yang membuat saya membaca sumber tty.py di sini:https://hg. python.org/cpython/file/618ea5612e83/Lib/tty.pyYang membawa saya pada kesimpulan bahwa jika tujuannya adalah untuk membaca karakter tunggal, bukan:

tty.setraw()

Gunakan:

tty.setcbreak()

Linux
  1. Apakah Mungkin Memiliki Binding Kunci Vim Di Terminal?

  2. Terminal Mac vi[m] Perintah Editor

  3. Bagaimana cara Keluar dari terminal Linux menggunakan skrip Python?

  1. Cara Mencetak File JSON dengan Cantik di Terminal Linux

  2. Linux – Mode Keyboard Mentah?

  3. Ubuntu 18.04 tidak akan membuka terminal setelah menginstal Python 3.7.4

  1. Emulator Terminal Apa yang Mendukung Mode Kontrol Tmux?

  2. Pseudo-terminal tidak akan dialokasikan karena stdin bukan terminal

  3. Bagaimana cara menjalankan skrip python di terminal (ubuntu)?