Python 3'te raw_input'u nasıl kullanırım


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

Python 3.1 kullanıyorum raw_inputve dos pop-up "dondurmak" alamıyorum . Okuduğum kitap Python 2.5 için ve Python 3.1 kullanıyorum

Bunu düzeltmek için ne yapmalıyım?


1
hm, NameError alıyorum: Kodunuzu kullanmaya çalıştığımda 'raw_input' adı tanımlanmadı. aynı anlamadın mı
SilentGhost


9
Python 3'te çok şey değişti, bu yüzden muhtemelen 2.5 için bir kitap kullanarak (gerçekten eski) ustalaşmaya çalışmamalısınız.
Niklas B.6

5
raw_input, python 3
krystan honor

Oauth2 bağlantısını takip ettiğimde http 401 hatası alıyorum
Big Ian

Yanıtlar:


1011

Python 3 ile başlayan raw_input(), yeniden adlandırıldı input().

Gönderen Yenilikler In Python 3.0, Yerleşikleri bölüm ikinci öğe.


56
Başlangıçta geçerli eval (input ()) gibi bir şey yapan bir fonksiyon input () vardı. Python'un daha az güvenlik bilincine sahip olduğu bir arttı. Değişiklik dili basitleştirdi. Daha ayrıntılı bir açıklama için bkz. "Bunu içe aktarma". Ölü bir dili gelişen bir dilden mi tercih edersiniz? Etrafta bol miktarda var.
meawoppl

9
Ben de piton öğrenme ve arasındaki tek fark bulunamadı ediyorum input()ve raw_input(). a = input()kullanıcı girişini alır ve doğru tipe koyar. Örn: kullanıcı 5 yazıyorsa, içindeki değer atamsayı 5 a = raw_input()olur. Kullanıcı girişini alır ve bir dize olarak koyar. Örn: kullanıcı 5 yazarsa, içindeki değer abir tamsayı değil '5' olur. Benim gibi python yeni başlayanlar için iyi bir bilgi olabilir düşündüm.
Vishnu Narang

10
@VishnuNarang Evet, bu Python 2'de doğrudur. Ancak Python 3'te bu davranış değişti ve girdi Python 2'de raw_input'un yaptığını yapıyor.
balpha

4
@balpha: Sadece doğrulandı. Haklısın. Python 2.7'im var (Şunu belirtmek için cevabı düzenleyemem ...)
Vishnu Narang

3
@meawoppl Python 2'den 3'e geçişin kırılması gerekiyordu. Olması gerektiği anlamına gelmez. Bir dil ölmeden ve işlev imzasını değiştirmeden gelişebilir. Küresel işlevleriniz yoksa yardımcı olur. Diğer dillerden bir bakışla başlayın. Vb. İşlevleri kaldırmak da tablodan değil.
dlamblin

117

Bu Python 3.x ve 2.x sürümlerinde çalışır:

# Fix Python 2.x.
try: input = raw_input
except NameError: pass
print("Hi " + input("Say something: "))

4
Bu yaklaşımla bir kapsam sorunu alıyordum . global inputArama işlevinin üstündeki bir ile düzeltildi .
kevlar1818

1
Bu benim için biraz daha temiz görünüyor: import __builtin__; input = getattr(__builtin__, 'raw_input', input)
mbarkhau

3
Python 3 adında bir modül yok __builtin__.
Cees Timmerman

@mbarkhau: çok küresel. Beklemeyen bir kütüphane çağırırsanız ne olur? Python 3'te __builtin__yeniden adlandırıldı builtins. Her ikisi de __builtins__CPython'da olduğu gibi kullanılabilir .
jfs

3
getattr(__builtins__, 'raw_input', input)Python 2.7.2'ye aktarıldığında varsayılanı döndürür.
Cees Timmerman

45

Bunu ele almanın güvenilir bir yolu

from six.moves import input

altı , 2/3 yaygın kod tabanı ağrı noktasının çoğuna yama yapan bir modüldür.


1
İyi fikir ... ve bunu yaparsanız from six.moves import input as raw_input, raw_inputbetiğinizde kalabilir ve her iki Python sürümünü kullanarak da çalıştırabilirsiniz.
eddy85br

15

Diğerlerinin de belirttiği gibi, raw_inputişlev inputPython 3.0'da yeniden adlandırıldı ve gerçekten daha güncel bir kitapla daha iyi hizmet edersiniz, ancak betiğinizin çıktısını görmenin daha iyi yolları olduğunu belirtmek istiyorum .

Açıklamanızdan, sanırım Windows'u kullanıyorsunuz, bir .pydosya kaydettiniz ve ardından çalıştırmak için üzerine çift tıklıyorsunuz. Açılan terminal penceresi, programınız biter bitmez kapanır, böylece programınızın sonucunun ne olduğunu göremezsiniz. Bunu çözmek için kitabınız , kullanıcı enter tuşuna basana kadar beklemek için bir raw_input/ inputifadesi eklemenizi önerir . Ancak, gördüğünüz gibi, programınızdaki bir hata gibi bir şeyler ters giderse, bu ifade yürütülmez ve neyin yanlış gittiğini görmeden pencere kapanır. Komut istemi veya IDLE kullanmayı daha kolay bulabilirsiniz.

Komut istemi kullanma

Python programınızı içeren klasör penceresine bakarken, shift tuşunu basılı tutun ve pencerenin beyaz arka plan alanında herhangi bir yere sağ tıklayın. Açılan menüde "Komut penceresini burada aç" girişi bulunmalıdır. (Bunun Windows Vista ve Windows 7'de çalıştığını düşünüyorum.) Bu, şuna benzer bir komut istemi penceresi açacaktır:

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

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

Programınızı çalıştırmak için aşağıdakileri yazın (komut dosyası adınızın yerine):

    python myscript.py

... ve enter tuşuna basın. ("Python" tarafından tanınan bir komut olmadığında bir hata alırsanız, bkz. Http://showmedo.com/videotutorials/video?name=960000&fromSeriesID=96 ) Programınız başarıyla tamamlanıp tamamlanmadığına bakıldığında, pencere başka bir komut yazmanız için komut istemi tekrar görünür. Programınızı tekrar çalıştırmak istiyorsanız, girdiğiniz önceki komutu geri çağırmak için yukarı oka, her seferinde dosya adını yazmak yerine tekrar çalıştırmak için enter tuşuna basabilirsiniz.

IDLE kullanın

IDLE, Python ile birlikte gelen basit bir program editörüdür. Diğer özelliklerin yanı sıra programlarınızı bir pencerede çalıştırabilir. .pyDosyanızı sağ tıklayın ve "IDLE'de Düzenle" yi seçin. Programınız düzenleyicide göründüğünde, F5 tuşuna basın veya "Çalıştır" menüsünden "Modülü çalıştır" ı seçin. Programınız, programınız bittikten sonra açık kalan ve hemen çalıştırmak için Python komutlarını girebileceğiniz bir pencerede çalışır.


IDLE Windows ile yüklü mü? Terminalimde IDLE veya rölantide çalıştırmak boş çıkıyor.
vgoff

1
IDLE, Windows'a Python ile yüklenir. Başlat menüsünde bir kısayol ve .py dosyaları için bir dosya ilişkilendirmesi olarak görünür, ancak varsayılan olarak yolunuza eklenen herhangi bir 'boş' komut olduğunu düşünmüyorum. Komut satırından başlatmak isterseniz, çalıştırabilirsinizpythonw -m idlelib.idle
Weeble

Bunu açıklıyor. İşletim sistemi olarak değil, yalnızca para kazanmak için Windows'a dokunuyorum. Daha sonra "IDLE Kullan" bölümünüzün önyargılı olduğunu söyleyebilirim. Belki seçicilikten bahsetmelisiniz.
vgoff

3
Anladığımdan emin değilim. Soru Windows'a özgüdür. Bir "DOS açılır penceresinden" bahsediyor. IDLE, Python'un bir parçası olarak yüklenir, ancak bazı distribütörler bunu ayırabilir. Örneğin, Ubuntu'da ayrı bir paket olarak yüklemeniz gerekiyor gibi görünüyor. Cevap zaten soru sorandan farklı bir yaklaşım öneriyor, bu yüzden ona daha fazla teğet eklememeyi tercih ederim. FWIW Evde Linux kullanıyorum ve sadece iş için kullanmam gereken Windows kullanıyorum.
Weeble

DOS, 1981 ve 1995 yılları arasında ya da 2000 yılına kadar kısmen DOS tabanlı Microsoft Windows sürümleri 95, 98 ve Millennium Edition dahil olmak üzere IBM PC uyumlu pazara hakim olan ve yakından ilişkili birkaç işletim sisteminin kısaltmasıdır.
vgoff

7

Timmerman'ın çözümü kodu çalıştırırken harika çalışıyor, ancak Undefined namepyflakes veya benzer bir linter kullanırken hata almak istemiyorsanız bunun yerine aşağıdakileri kullanabilirsiniz:

try:
    import __builtin__
    input = getattr(__builtin__, 'raw_input')
except (ImportError, AttributeError):
    pass

Ha, ben hala PyLint hatalardan sürü alıyorum: Redefining built-in 'input' (redefined-builtin), Unable to import '__builtin__' (import-error), Invalid constant name "input" (invalid-name).
Babken Vardanyan

@BabkenVardanyan pylint, kod stili söz konusu olduğunda kötü şöhretlidir. Ben öneriyoruz flake8veya pyflakesöylesine olmasın olarak anlamsız uyarılar ile tüm gün sürebilir.
jmagnusson

6

Scriptlerime koyduğum, py2 / 3-agnostik ortamda çalıştırmak istemediğim bir kod parçası:

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

Şimdi real_raw_input kullanabilirsiniz. Oldukça pahalı ama kısa ve okunabilir. Ham girdiyi kullanmak genellikle zaman pahalıdır (girişi beklemektedir), bu yüzden önemli değildir.

Teoride, real_raw_input yerine raw_input bile atayabilirsiniz, ancak raw_input varlığını kontrol eden ve buna göre davranan modüller olabilir. Güvenli tarafta kalmak daha iyi.


Bunu denediğimde alıyorum: inputcons = vars ( builtins ) .get ('raw_input', input) TypeError: vars () argümanı dict niteliğine sahip olmalıdır

0

Muhtemelen en iyi çözüm değil, ama buraya gelmeden önce, çalışmadan hızlı bir mola vermeden çalışmaya devam etmek için bunu hemen yaptım.

def raw_input(x):
  input(x)

Sonra raw_input('Enter your first name: ')üzerinde çalıştığım senaryoyu çalıştırdığımda olduğu gibi yakalar input().

Bunu yapmamam için bir neden olabilir, henüz karşılaşmadım!


7
Neden sadece raw_input = input?
tonypdmtr
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.