ฉันจะใช้ raw_input ใน Python 3 ได้อย่างไร


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

ฉันใช้ Python 3.1 และไม่สามารถraw_input"หยุด" ป๊อปอัป dos ได้ หนังสือที่ฉันกำลังอ่านสำหรับ Python 2.5 และฉันใช้ Python 3.1

ฉันควรทำอย่างไรเพื่อแก้ไขปัญหานี้


1
อืมฉันกำลังได้รับ NameError: ชื่อ 'raw_input' ไม่ได้ถูกกำหนดไว้เมื่อฉันพยายามใช้รหัสของคุณ คุณไม่ได้รับเหมือนกันหรือ
SilentGhost


9
มีการเปลี่ยนแปลงมากมายใน Python 3 ดังนั้นคุณอาจไม่ควรลองใช้หนังสือเล่มนี้เป็นเวลา 2.5 (ซึ่งเก่ามาก)
Niklas B.

5
raw_input ถูกเปลี่ยนชื่อเป็น input ใน python 3
krystan เพื่อเป็นเกียรติแก่

รับข้อผิดพลาด http 401 เมื่อฉันติดตามลิงก์ Oauth2
Big Ian

คำตอบ:


1011

เริ่มต้นกับงูหลาม 3 ถูกเปลี่ยนชื่อเป็นraw_input()input()

จากมีอะไรใหม่ใน Python 3.0รายการในส่วนที่สอง


56
แต่เดิมมีฟังก์ชั่นอินพุต () ซึ่งทำหน้าที่คล้าย eval ปัจจุบัน (อินพุต ()) มันเป็นสิ่งที่เหลืออยู่เมื่อ Python ใส่ใจเรื่องความปลอดภัยน้อยกว่า การเปลี่ยนแปลงทำให้ภาษาง่ายขึ้น ดูเพิ่มเติมที่ "นำเข้าสิ่งนี้" สำหรับคำอธิบายที่ลึกซึ้งยิ่งขึ้น คุณต้องการภาษาที่ตายแล้วหรือไม่กับภาษาที่วิวัฒนาการ? มีคนรอบข้างมากมาย
meawoppl

9
ฉันเรียนรู้หลามเป็นอย่างดีและพบความแตกต่างระหว่างและ input() จะนำอินพุตของผู้ใช้และใส่ไว้ในประเภทที่ถูกต้อง เช่น: ถ้าผู้ใช้พิมพ์ 5 ค่าจะเป็นจำนวนเต็ม 5 จะนำเข้าผู้ใช้และใส่เป็นสตริง เช่น: หากผู้ใช้พิมพ์ 5 ค่าจะเป็นสตริง '5' และไม่ใช่จำนวนเต็ม คิดว่ามันอาจเป็นข้อมูลที่ดีสำหรับมือใหม่ในงูใหญ่เหมือนตัวฉัน raw_input()a = input()aa = raw_input()a
Vishnu Narang

10
@VishnuNarang Yep ที่ถูกต้องใน Python 2 แต่ใน Python 3 พฤติกรรมนี้เปลี่ยนไปและอินพุตทำสิ่งที่ raw_input ทำใน Python 2
balpha

4
@balpha: เพิ่งยืนยัน คุณถูก. ฉันมี python 2.7 (ไม่สามารถแก้ไขคำตอบที่กล่าวถึง ... )
Vishnu Narang

3
@meawoppl การย้ายจาก python 2 เป็น 3 หมายถึงการแตกหัก ไม่ได้หมายความว่าจะต้องเป็น ภาษาสามารถพัฒนาได้โดยไม่ตายและไม่เปลี่ยนลายเซ็นของฟังก์ชัน ช่วยถ้าคุณไม่มีฟังก์ชั่นระดับโลก เริ่มด้วยการเข้าใจถึงปัญหาย้อนหลังจากภาษาอื่น ๆ ฯลฯ การลบฟังก์ชั่นไม่ได้อยู่ในตารางเช่นกัน
dlamblin

117

สิ่งนี้ใช้ได้ใน Python 3.x และ 2.x:

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

4
ฉันได้รับปัญหาเกี่ยวกับขอบเขตด้วยวิธีนี้ แก้ไขด้วย a global inputที่ด้านบนของฟังก์ชั่นการโทร
kevlar1818

1
ดูเหมือนว่าฉันจะสะอาดกว่านี้อีกเล็กน้อย: import __builtin__; input = getattr(__builtin__, 'raw_input', input)
mbarkhau

3
งูหลาม 3 __builtin__มีโมดูลไม่มีชื่อ
Cees Timmerman

@mbarkhau: มันเป็นโลกกว้างเกินไป ถ้าคุณเรียกห้องสมุดที่ไม่คาดคิดล่ะ __builtin__ถูกเปลี่ยนชื่อเป็นbuiltinsใน Python 3 ทั้งสองมีอยู่__builtins__ใน CPython
jfs

3
getattr(__builtins__, 'raw_input', input)ส่งกลับค่าเริ่มต้นเมื่อนำเข้าใน Python 2.7.2
Cees Timmerman

45

วิธีที่เชื่อถือได้ในการแก้ไขปัญหานี้คือ

from six.moves import input

sixเป็นโมดูลที่ปะต่อจุดปวดพื้นฐานรหัส 2/3 จำนวนมาก


1
ความคิดที่ดี ... และถ้าคุณทำfrom six.moves import input as raw_inputคุณสามารถเก็บไว้raw_inputในสคริปต์ของคุณและเรียกใช้ทั้งสองรุ่น
eddy85br

15

ตามที่คนอื่น ๆ ระบุไว้raw_inputฟังก์ชั่นถูกเปลี่ยนชื่อเป็นinputPython 3.0 และคุณจะได้รับบริการที่ดีขึ้นจากหนังสือที่ทันสมัยกว่า แต่ฉันต้องการชี้ให้เห็นว่ามีวิธีที่ดีกว่าในการดูผลลัพธ์ของสคริปต์ของคุณ .

จากคำอธิบายของคุณฉันคิดว่าคุณกำลังใช้ Windows คุณได้บันทึก.pyไฟล์จากนั้นคุณดับเบิลคลิกเพื่อเรียกใช้ หน้าต่างเทอร์มินัลที่ปรากฏขึ้นจะปิดลงทันทีที่โปรแกรมสิ้นสุดลงดังนั้นคุณจะไม่สามารถเห็นผลลัพธ์ของโปรแกรมของคุณได้ เพื่อแก้ปัญหานี้หนังสือของคุณแนะนำให้เพิ่มraw_input/ inputคำสั่งเพื่อรอจนกว่าผู้ใช้กด อย่างไรก็ตามอย่างที่คุณเห็นถ้ามีอะไรผิดพลาดเช่นเกิดข้อผิดพลาดในโปรแกรมของคุณคำสั่งนั้นจะไม่ถูกเรียกใช้และหน้าต่างจะปิดลงโดยที่คุณไม่สามารถเห็นสิ่งที่ผิดพลาดได้ คุณอาจพบว่าการใช้ command-prompt หรือ IDLE ง่ายขึ้น

ใช้ command-prompt

เมื่อคุณดูที่หน้าต่างโฟลเดอร์ที่มีโปรแกรม Python ของคุณกด shift ค้างไว้และคลิกขวาที่ใดก็ได้ในพื้นที่พื้นหลังสีขาวของหน้าต่าง เมนูที่ปรากฏขึ้นควรมีรายการ "หน้าต่างคำสั่งเปิดที่นี่" (ฉันคิดว่ามันใช้งานได้กับ Windows Vista และ Windows 7) นี่จะเปิดหน้าต่าง command-prompt ที่มีลักษณะดังนี้:

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

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

ในการรันโปรแกรมของคุณให้พิมพ์ดังต่อไปนี้ (แทนที่ชื่อสคริปต์ของคุณ):

    python myscript.py

... และกด Enter (หากคุณได้รับข้อผิดพลาดว่า "python" ไม่ใช่คำสั่งที่รู้จักให้ดูที่http://showmedo.com/videotutorials/video?name=960000&fromSeriesID=96 ) เมื่อโปรแกรมของคุณทำงานเสร็จไม่ว่าจะสำเร็จหรือไม่ จะยังคงเปิดอยู่และพรอมต์คำสั่งจะปรากฏขึ้นอีกครั้งเพื่อให้คุณพิมพ์คำสั่งอื่น หากคุณต้องการเรียกใช้โปรแกรมของคุณอีกครั้งคุณสามารถกดลูกศรขึ้นเพื่อเรียกคืนคำสั่งก่อนหน้าที่คุณป้อนและกด Enter เพื่อเรียกใช้อีกครั้งแทนที่จะต้องพิมพ์ชื่อไฟล์ทุกครั้ง

ใช้ IDLE

IDLE เป็นเครื่องมือแก้ไขโปรแกรมอย่างง่ายที่มาพร้อมกับ Python ในบรรดาคุณสมบัติอื่น ๆ มันสามารถเรียกใช้โปรแกรมของคุณในหน้าต่าง คลิกขวาที่.pyไฟล์ของคุณและเลือก "แก้ไขใน IDLE" เมื่อโปรแกรมของคุณปรากฏในโปรแกรมแก้ไขให้กด F5 หรือเลือก "Run module" จากเมนู "Run" โปรแกรมของคุณจะทำงานในหน้าต่างที่ยังคงเปิดอยู่หลังจากที่โปรแกรมของคุณสิ้นสุดลงและคุณสามารถป้อนคำสั่ง Python เพื่อให้ทำงานได้ทันที


ติดตั้ง IDLE กับ Windows หรือไม่ การใช้งาน IDLE หรือ idle ในเทอร์มินัลของฉันว่างเปล่า
vgoff

1
IDLE ได้รับการติดตั้งด้วย Python บน Windows มันจะปรากฏเป็นทางลัดในเมนูเริ่มและเป็นไฟล์เชื่อมโยงสำหรับไฟล์. py แต่ฉันไม่คิดว่าจะมีคำสั่ง 'ไม่ใช้งาน' ใด ๆ ที่เพิ่มเข้าไปในพา ธ ของคุณตามค่าเริ่มต้น หากคุณต้องการเริ่มจากบรรทัดคำสั่งคุณสามารถเรียกใช้pythonw -m idlelib.idle
Weeble

นั่นอธิบายได้ ฉันแตะ Windows เพื่อทำเงินเท่านั้นไม่ใช่ระบบปฏิบัติการ ฉันจะบอกว่าส่วน "ใช้ IDLE" ของคุณนั้นมีอคติแล้ว คุณควรพูดถึงการเลือกสรรบางที
vgoff

3
ฉันไม่แน่ใจว่าฉันเข้าใจ คำถามคือเฉพาะ Windows มันพูดถึง "ป๊อปอัพ DOS" IDLE ได้รับการติดตั้งเป็นส่วนหนึ่งของ Python แต่ผู้จัดจำหน่ายบางรายอาจแยกออกจากกัน ตัวอย่างเช่นใน Ubuntu ดูเหมือนว่าคุณจะต้องติดตั้งเป็นแพ็คเกจแยกต่างหาก คำตอบนั้นแนะนำวิธีการที่แตกต่างจากที่ผู้ถามถามดังนั้นฉันจึงไม่ควรเพิ่ม tangents เพิ่มเติม FWIW ฉันใช้ Linux ที่บ้านและใช้ Windows ที่ฉันต้องทำงานเท่านั้น
Weeble

ดอสเป็นตัวย่อสำหรับระบบปฏิบัติการที่เกี่ยวข้องอย่างใกล้ชิดหลายแห่งซึ่งครอบครองตลาดพีซี IBM ที่ใช้งานร่วมกันได้ระหว่างปี 1981 และ 1995 หรือจนถึงประมาณปี 2000 รวมถึง Microsoft Windows รุ่น 95, 98 และ Millennium Edition ที่ใช้ DOS บางส่วน
vgoff

7

โซลูชันของ Timmerman ใช้งานได้ดีเมื่อใช้รหัส แต่ถ้าคุณไม่ต้องการรับUndefined nameข้อผิดพลาดเมื่อใช้ pyflakes หรือ linter ที่คล้ายกันคุณสามารถใช้สิ่งต่อไปนี้แทน:

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

เอ๊ะฉันกำลังยังคงได้รับจำนวนมากของข้อผิดพลาดใน Redefining built-in 'input' (redefined-builtin)pylint: Unable to import '__builtin__' (import-error), Invalid constant name "input" (invalid-name),
Babken Vardanyan

@BabkenVardanyan pylint มีความเข้มงวดฉาวโฉ่เมื่อพูดถึงรูปแบบโค้ด ฉันจะแนะนำflake8หรือpyflakesเพื่อไม่ให้ใช้เวลาทั้งวันด้วยคำเตือนที่ไร้ความหมาย
jmagnusson

6

นี่คือส่วนหนึ่งของรหัสที่ฉันใส่ในสคริปต์ของฉันที่ฉันไม่ต้องการเรียกใช้ในสภาพแวดล้อมที่ไม่เชื่อเรื่องพระเจ้า py2 / 3:

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

ตอนนี้คุณสามารถใช้ real_raw_input มันค่อนข้างแพง แต่สั้นและอ่านง่าย การใช้อินพุตดิบมักใช้เวลาแพง (กำลังรออินพุต) ดังนั้นจึงไม่สำคัญ

ในทางทฤษฎีคุณสามารถกำหนด raw_input แทน real_raw_input แต่อาจมีโมดูลที่ตรวจสอบการมีอยู่ของ raw_input และทำงานตามนั้น มันจะดีกว่าอยู่ในด้านความปลอดภัย


ฉันได้รับสิ่งนี้เมื่อฉันลอง: inputcons = vars ( builtins ) .get ('raw_input', อินพุต) TypeError: vars () อาร์กิวเมนต์ต้องมีแอตทริบิวต์dict

0

อาจไม่ใช่วิธีที่ดีที่สุด แต่ก่อนที่ฉันจะมาที่นี่ฉันเพิ่งทำสิ่งนี้ได้ทันทีเพื่อทำงานต่อไปโดยไม่หยุดพักการเรียนอย่างรวดเร็ว

def raw_input(x):
  input(x)

จากนั้นเมื่อฉันรันraw_input('Enter your first name: ')สคริปต์ที่ฉันทำงานมันจะจับภาพตามที่input()ต้องการ

อาจมีเหตุผลที่จะไม่ทำสิ่งนี้ฉันยังไม่เจอ!


7
ทำไมไม่เพียงraw_input = input?
tonypdmtr
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.