Bagaimana cara menggunakan raw_input dalam Python 3

553
import sys
print(sys.platform)
print(2**100)
raw_input()

Saya menggunakan Python 3.1 dan tidak bisa raw_input"membekukan" dos pop-up. Buku yang saya baca adalah untuk Python 2.5 dan saya menggunakan Python 3.1

Apa yang harus saya lakukan untuk memperbaikinya?

Harga Lonnie
sumber
1
hm, saya mendapatkan NameError: nama 'raw_input' tidak didefinisikan ketika saya mencoba menggunakan kode Anda. apakah kamu tidak mendapatkan yang sama?
SilentGhost
9
Ada banyak perubahan di Python 3, jadi mungkin Anda sebaiknya tidak mencoba menguasainya menggunakan buku untuk 2,5 (yang sudah sangat lama).
Niklas B.
5
raw_input diubah namanya menjadi input python 3
krystan honor
Mendapatkan kesalahan http 401 ketika saya mengikuti tautan Oauth2
Big Ian

Jawaban:

1011

Dimulai dengan Python 3, raw_input()diubah namanya menjadi input().

Dari What's New In Python 3.0, bagian kedua bagian Builtins .

balpha
sumber
56
Awalnya ada input fungsi () yang bertindak seperti eval saat ini (input ()). Itu adalah sisa dari ketika Python kurang sadar keamanan. Perubahan itu menyederhanakan bahasa. Lihat juga "impor ini" untuk penjelasan yang lebih dalam. Apakah Anda lebih suka bahasa mati daripada yang berkembang? Ada banyak dari mereka di sekitar.
meawoppl
9
Saya belajar python juga dan menemukan satu perbedaan antara input()dan raw_input(). a = input()akan mengambil input pengguna dan memasukkannya ke dalam tipe yang benar. Misalnya: jika pengguna mengetik 5 maka nilai dalam aadalah integer 5. a = raw_input()akan mengambil input pengguna dan meletakkannya sebagai string. Misalnya: jika pengguna mengetik 5 maka nilai dalam aadalah string '5' dan bukan bilangan bulat. Kupikir itu mungkin info yang bagus untuk pemula dengan python seperti diriku.
Wisnu Narang
10
@ WisnuNarang Yap, itu benar dalam Python 2. Tetapi dalam Python 3, perilaku ini berubah, dan input melakukan apa yang raw_input lakukan dalam Python 2.
balpha
4
@balpha: Baru diverifikasi. Anda benar. Saya memiliki python 2.7 (Tidak dapat mengedit jawaban untuk menyebutkan bahwa ...)
Vishnu Narang
3
@meawoppl Pindah dari python 2 ke 3 dimaksudkan untuk melanggar. Bukan berarti harus seperti itu. Suatu bahasa dapat berevolusi tanpa mati dan tanpa mengubah fungsi tanda tangan. Ini membantu jika Anda tidak memiliki fungsi global. Mulailah dengan melihat ke belakang dari bahasa lain. Dll. Fungsi menghapus juga tidak ketinggalan.
dlamblin
117

Ini berfungsi dalam Python 3.x dan 2.x:

# Fix Python 2.x.
try: input = raw_input
except NameError: pass
print("Hi " + input("Say something: "))
Cees Timmerman
sumber
4
Saya mendapatkan masalah ruang lingkup dengan pendekatan ini. Memperbaikinya dengan global inputdi bagian atas fungsi panggilan.
kevlar1818
1
Ini sepertinya sedikit lebih bersih bagi saya: import __builtin__; input = getattr(__builtin__, 'raw_input', input)
mbarkhau
3
Python 3 tidak memiliki modul bernama __builtin__.
Cees Timmerman
@ MBarkhau: terlalu global. Bagaimana jika Anda memanggil perpustakaan yang tidak mengharapkannya? __builtin__diubah namanya menjadi builtinsPython 3. Keduanya tersedia seperti __builtins__dalam CPython.
jfs
3
getattr(__builtins__, 'raw_input', input)mengembalikan default ketika diimpor dalam Python 2.7.2.
Cees Timmerman
45

Cara yang dapat diandalkan untuk mengatasi ini adalah

from six.moves import input

enam adalah modul yang menambal lebih dari 2/3 poin nyeri basis kode umum.

tacaswell
sumber
1
Ide bagus ... dan jika Anda melakukannya from six.moves import input as raw_input, Anda dapat menyimpan raw_inputskrip Anda dan menjalankannya menggunakan kedua versi Python.
eddy85br
15

Seperti yang telah ditunjukkan orang lain, raw_inputfungsinya telah diubah namanya menjadi inputPython 3.0, dan Anda benar-benar akan lebih baik dilayani oleh buku yang lebih mutakhir, tetapi saya ingin menunjukkan bahwa ada cara yang lebih baik untuk melihat hasil skrip Anda .

Dari deskripsi Anda, saya pikir Anda menggunakan Windows, Anda telah menyimpan .pyfile dan kemudian Anda mengklik dua kali untuk menjalankannya. Jendela terminal yang muncul menutup segera setelah program Anda berakhir, sehingga Anda tidak dapat melihat apa hasil dari program Anda. Untuk mengatasi ini, buku Anda merekomendasikan untuk menambahkan raw_input/ inputpernyataan menunggu sampai pengguna menekan masuk. Namun, seperti yang Anda lihat, jika ada kesalahan, seperti kesalahan dalam program Anda, pernyataan itu tidak akan dieksekusi dan jendela akan ditutup tanpa Anda dapat melihat apa yang salah. Anda mungkin lebih mudah menggunakan command-prompt atau IDLE.

Gunakan command-prompt

Saat Anda melihat jendela folder yang berisi program Python Anda, tahan shift dan klik kanan di mana saja di area latar belakang putih jendela. Menu yang muncul harus berisi entri "Buka jendela perintah di sini". (Saya pikir ini bekerja pada Windows Vista dan Windows 7.) Ini akan membuka jendela command-prompt yang terlihat seperti ini:

    Microsoft Windows [Version 6.1.7601]
    Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

    C:\Users\Weeble\My Python Program>_

Untuk menjalankan program Anda, ketikkan yang berikut (gantikan nama skrip Anda):

    python myscript.py

... dan tekan enter. (Jika Anda mendapatkan kesalahan bahwa "python" bukan perintah yang dikenali, lihat http://showmedo.com/videotutorials/video?name=960000&fromSeriesID=96 ) Ketika program Anda selesai berjalan, apakah itu berhasil diselesaikan atau tidak, jendela akan tetap terbuka dan prompt perintah akan muncul lagi untuk Anda ketik perintah lain. Jika Anda ingin menjalankan program Anda lagi, Anda dapat menekan panah atas untuk mengingat perintah sebelumnya yang Anda masukkan dan tekan enter untuk menjalankannya lagi, daripada harus mengetikkan nama file setiap kali.

Gunakan IDLE

IDLE adalah editor program sederhana yang dilengkapi dengan Python. Di antara fitur-fitur lain dapat menjalankan program Anda di jendela. Klik kanan pada .pyfile Anda dan pilih "Edit di IDLE". Ketika program Anda muncul di editor, tekan F5 atau pilih "Run module" dari menu "Run". Program Anda akan berjalan di jendela yang tetap terbuka setelah program Anda berakhir, dan di mana Anda dapat memasukkan perintah Python untuk segera dijalankan.

Weeble
sumber
Apakah IDLE diinstal dengan Windows? Menjalankan IDLE atau idle di terminal saya muncul kosong.
vgoff
1
IDLE diinstal dengan Python di Windows. Ini muncul sebagai jalan pintas di menu mulai dan sebagai asosiasi file untuk file .py, tapi saya rasa tidak ada perintah 'idle' yang ditambahkan ke path Anda secara default. Jika Anda ingin memulainya dari command-line, Anda dapat menjalankanpythonw -m idlelib.idle
Weeble
Itu menjelaskannya. Saya hanya menyentuh Windows untuk menghasilkan uang, bukan sebagai OS. Saya kemudian akan mengatakan bahwa bagian "Gunakan IDLE" Anda bias. Anda harus menyebutkan selektivitasnya, mungkin.
vgoff
3
Saya tidak yakin saya mengerti. Pertanyaannya adalah khusus Windows. Ini berbicara tentang "popup DOS". IDLE diinstal sebagai bagian dari Python, tetapi beberapa distributor dapat memisahkannya. Misalnya, di Ubuntu sepertinya Anda harus menginstalnya sebagai paket terpisah. Jawabannya sudah menyarankan pendekatan yang berbeda dari yang diminta penanya, jadi saya lebih suka tidak menambahkan garis singgung lebih lanjut untuk itu. FWIW Saya menggunakan Linux di rumah dan hanya menggunakan Windows di mana saya harus bekerja.
Weeble
DOS menjadi akronim untuk beberapa sistem operasi terkait erat yang mendominasi pasar IBM PC kompatibel antara tahun 1981 dan 1995, atau sampai sekitar tahun 2000 termasuk Microsoft Windows versi 95, 98, dan Millennium Edition yang berbasis DOS.
vgoff
7

Solusi Timmerman bekerja sangat baik ketika menjalankan kode, tetapi jika Anda tidak ingin mendapatkan Undefined namekesalahan saat menggunakan pyflakes atau linter serupa Anda bisa menggunakan yang berikut ini sebagai gantinya:

try:
    import __builtin__
    input = getattr(__builtin__, 'raw_input')
except (ImportError, AttributeError):
    pass
jmagnusson
sumber
Eh, aku masih mendapatkan banyak kesalahan dalam pylint: Redefining built-in 'input' (redefined-builtin), Unable to import '__builtin__' (import-error), Invalid constant name "input" (invalid-name).
Babken Vardanyan
@BabkenVardany pylint terkenal sangat ketat dalam hal gaya kode. Saya akan merekomendasikan flake8atau pyflakesagar tidak menghabiskan seluruh hari Anda dengan peringatan yang tidak berarti.
jmagnusson
6

Berikut adalah sepotong kode yang saya masukkan ke dalam skrip yang tidak ingin saya jalankan di lingkungan py2 / 3-agnostic:

# Thank you, python2-3 team, for making such a fantastic mess with
# input/raw_input :-)
real_raw_input = vars(__builtins__).get('raw_input',input)

Sekarang Anda dapat menggunakan real_raw_input. Cukup mahal tapi pendek dan mudah dibaca. Menggunakan input mentah biasanya mahal waktu (menunggu input), jadi itu tidak penting.

Secara teori, Anda bahkan dapat menetapkan raw_input alih-alih real_raw_input tetapi mungkin ada modul yang memeriksa keberadaan raw_input dan berperilaku sesuai. Lebih baik tetap di sisi yang aman.

ChewbaccaKL
sumber
Saya mendapatkan ini ketika saya mencobanya: inputcons = vars ( builtins ) .get ('raw_input', input) argumen TypeError: vars () harus memiliki atribut dict
0

Mungkin bukan solusi terbaik, tetapi sebelum saya datang ke sini saya hanya membuat ini dengan cepat untuk tetap bekerja tanpa istirahat sejenak dari belajar.

def raw_input(x):
  input(x)

Kemudian ketika saya menjalankan raw_input('Enter your first name: ')skrip yang sedang saya kerjakan, itu menangkapnya seperti halnya input().

Mungkin ada alasan untuk tidak melakukan ini, bahwa saya belum menemukan!

Danijel-James W
sumber
7
Kenapa tidak adil raw_input = input?
tonypdmtr