Làm cách nào để sử dụng raw_input trong Python 3


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

Tôi đang sử dụng Python 3.1 và không thể raw_input"đóng băng" cửa sổ bật lên dos. Cuốn sách tôi đang đọc là dành cho Python 2.5 và tôi đang sử dụng Python 3.1

Tôi nên làm gì để khắc phục điều này?


1
hm, tôi đang nhận NameError: tên 'raw_input' không được xác định khi tôi đang cố sử dụng mã của bạn. bạn không giống nhau à?
SilentGhost


9
Đã có nhiều thay đổi trong Python 3, vì vậy có lẽ bạn không nên cố gắng thành thạo nó bằng cách sử dụng một cuốn sách cho 2.5 (cái này thực sự cũ).
Niklas B.

5
raw_input đã được đổi tên thành đầu vào trong python 3
danh dự của kstallan

Gặp lỗi http 401 khi tôi theo liên kết Oauth2
Big Ian

Câu trả lời:


1011

Bắt đầu với Python 3, raw_input()được đổi tên thành input().

Từ What New trong Python 3.0, mục thứ hai của mục tích hợp.


56
Ban đầu có một hàm input () hoạt động giống như eval hiện tại (input ()). Đó là một phần còn lại từ khi Python ít có ý thức bảo mật. Sự thay đổi đơn giản hóa ngôn ngữ. Xem thêm "nhập cái này" để được giải thích sâu hơn. Bạn có muốn một ngôn ngữ chết với một ngôn ngữ phát triển? Có rất nhiều những người xung quanh.
meawoppl

9
Tôi cũng đang học trăn và tìm thấy một sự khác biệt giữa input()raw_input(). a = input()sẽ lấy đầu vào của người dùng và đặt nó vào đúng loại. Ví dụ: nếu người dùng nhập 5 thì giá trị trong alà số nguyên 5. a = raw_input()sẽ lấy đầu vào của người dùng và đặt nó dưới dạng chuỗi. Ví dụ: nếu người dùng nhập 5 thì giá trị trong alà chuỗi '5' và không phải là số nguyên. Nghĩ rằng nó có thể là thông tin tốt cho những người mới ở python như tôi.
Vishnu Narang

10
@VishnuNarang Yep, điều đó đúng trong Python 2. Nhưng trong Python 3, hành vi này đã thay đổi và đầu vào thực hiện những gì raw_input đã làm trong Python 2.
balpha

4
@balpha: Chỉ cần xác minh. Bạn nói đúng. Tôi có python 2.7 (Không thể chỉnh sửa câu trả lời để đề cập đến điều đó ...)
Vishnu Narang

3
@meawoppl Di chuyển từ python 2 đến 3 có nghĩa là bị phá vỡ. Nó không có nghĩa là nó phải được. Một ngôn ngữ có thể phát triển mà không chết và không thay đổi chữ ký hàm. Nó giúp nếu bạn không có chức năng toàn cầu. Bắt đầu với một số nhận thức từ các ngôn ngữ khác. V.v. Việc loại bỏ các chức năng cũng không nằm ngoài bảng.
dlamblin

117

Điều này hoạt động trong Python 3.x và 2.x:

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

4
Tôi đã nhận được một vấn đề phạm vi với phương pháp này. Đã sửa nó bằng một global inputđầu ở chức năng gọi.
kevlar1818

1
Điều này có vẻ sạch sẽ hơn với tôi: import __builtin__; input = getattr(__builtin__, 'raw_input', input)
mbarkhau

3
Python 3 không có mô-đun có tên __builtin__.
Cees Timmerman

@mbarkhau: nó quá toàn cầu. Điều gì nếu bạn gọi một thư viện mà không mong đợi nó? __builtin__được đổi tên thành builtinsPython 3. Cả hai đều có sẵn như __builtins__trong CPython.
JFS

3
getattr(__builtins__, 'raw_input', input)trả về mặc định khi được nhập trong Python 2.7.2.
Cees Timmerman

45

Một cách đáng tin cậy để giải quyết điều này là

from six.moves import input

sáu là một mô-đun vá trên nhiều điểm đau cơ bản 2/3.


1
Ý tưởng hay ... và nếu bạn làm thế from six.moves import input as raw_input, bạn có thể giữ raw_inputtập lệnh của mình và chạy bằng cả hai phiên bản Python.
eddy85br

15

Như những người khác đã chỉ ra, raw_inputchức năng đã được đổi tên thành inputPython 3.0 và bạn thực sự sẽ được phục vụ tốt hơn bởi một cuốn sách cập nhật hơn, nhưng tôi muốn chỉ ra rằng có nhiều cách tốt hơn để xem đầu ra của tập lệnh của bạn .

Từ mô tả của bạn, tôi nghĩ rằng bạn đang sử dụng Windows, bạn đã lưu một .pytệp và sau đó bạn nhấp đúp vào tệp đó để chạy tệp đó. Cửa sổ đầu cuối bật lên đóng lại ngay khi chương trình của bạn kết thúc, vì vậy bạn không thể thấy kết quả của chương trình là gì. Để giải quyết vấn đề này, cuốn sách của bạn khuyên bạn nên thêm một câu lệnh raw_input/ inputđể đợi cho đến khi người dùng nhấn enter. Tuy nhiên, như bạn đã thấy, nếu có lỗi xảy ra, chẳng hạn như lỗi trong chương trình của bạn, câu lệnh đó sẽ không được thực thi và cửa sổ sẽ đóng mà bạn không thể thấy điều gì sai. Bạn có thể thấy dễ dàng hơn khi sử dụng dấu nhắc lệnh hoặc IDLE.

Sử dụng một dấu nhắc lệnh

Khi bạn đang nhìn vào cửa sổ thư mục chứa chương trình Python của bạn, nhấn giữ phím shift và nhấp chuột phải vào bất cứ nơi nào trong khu vực nền trắng của cửa sổ. Menu bật lên sẽ chứa một mục "Mở cửa sổ lệnh ở đây". (Tôi nghĩ rằng điều này hoạt động trên Windows Vista và Windows 7.) Điều này sẽ mở một cửa sổ nhắc lệnh trông giống như thế này:

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

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

Để chạy chương trình của bạn, hãy nhập như sau (thay thế tên tập lệnh của bạn):

    python myscript.py

... và nhấn enter. (Nếu bạn nhận được một lỗi rằng "trăn" không phải là một lệnh công nhận, xem http://showmedo.com/videotutorials/video?name=960000&fromSeriesID=96 ) Khi kết thúc chương trình của bạn chạy, cho dù đó hoàn tất thành công hay không, cửa sổ sẽ vẫn mở và dấu nhắc lệnh sẽ xuất hiện lại để bạn nhập lệnh khác. Nếu bạn muốn chạy lại chương trình của mình, bạn có thể nhấn mũi tên lên để gọi lại lệnh trước đó bạn đã nhập và nhấn enter để chạy lại chương trình, thay vì phải gõ tên tệp mỗi lần.

Sử dụng IDLE

IDLE là một trình soạn thảo chương trình đơn giản được cài đặt bằng Python. Trong số các tính năng khác, nó có thể chạy các chương trình của bạn trong một cửa sổ. Nhấp chuột phải vào .pytệp của bạn và chọn "Chỉnh sửa trong IDLE". Khi chương trình của bạn xuất hiện trong trình chỉnh sửa, nhấn F5 hoặc chọn "Chạy mô-đun" từ menu "Chạy". Chương trình của bạn sẽ chạy trong một cửa sổ vẫn mở sau khi chương trình của bạn kết thúc và trong đó bạn có thể nhập các lệnh Python để chạy ngay lập tức.


IDLE có được cài đặt với Windows không? Chạy IDLE hoặc không hoạt động trong thiết bị đầu cuối của tôi trống rỗng.
vgoff

1
IDLE được cài đặt với Python trên Windows. Nó xuất hiện dưới dạng một phím tắt trong menu bắt đầu và dưới dạng liên kết tệp cho các tệp .py, nhưng tôi không nghĩ rằng có bất kỳ lệnh 'nhàn rỗi' nào được thêm vào đường dẫn của bạn theo mặc định. Nếu bạn muốn khởi động nó từ dòng lệnh, bạn có thể chạypythonw -m idlelib.idle
Weeble

Giải thích nó. Tôi chỉ chạm vào Windows để kiếm tiền, không phải là một hệ điều hành. Sau đó tôi sẽ nói rằng phần "Sử dụng IDLE" của bạn sau đó bị sai lệch. Bạn nên đề cập đến sự chọn lọc, có lẽ.
vgoff

3
Tôi không chắc là tôi hiểu. Câu hỏi là dành riêng cho Windows. Nó nói về một "cửa sổ bật lên DOS". IDLE được cài đặt như một phần của Python, nhưng một số nhà phân phối có thể tách nó ra. Ví dụ, trong Ubuntu có vẻ như bạn phải cài đặt nó dưới dạng một gói riêng. Câu trả lời đã gợi ý một cách tiếp cận khác với câu hỏi được yêu cầu, vì vậy tôi không muốn thêm các tiếp tuyến vào nó. FWIW Tôi sử dụng Linux tại nhà và chỉ sử dụng Windows khi tôi phải làm việc.
Weeble

DOS là từ viết tắt của một số hệ điều hành có liên quan chặt chẽ, thống trị thị trường tương thích với PC của IBM từ năm 1981 đến năm 1995, hoặc cho đến khoảng năm 2000 bao gồm các phiên bản Microsoft Windows 95, 98 và Phiên bản Thiên niên kỷ dựa trên DOS.
vgoff

7

Giải pháp của Timmerman hoạt động rất tốt khi chạy mã, nhưng nếu bạn không muốn gặp Undefined namelỗi khi sử dụng pyflakes hoặc một kẻ nói dối tương tự, bạn có thể sử dụng cách sau:

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

Eh, tôi vẫn nhận được rất nhiều sai sót trong pylint: Redefining built-in 'input' (redefined-builtin), Unable to import '__builtin__' (import-error), Invalid constant name "input" (invalid-name).
Babken Vardanyan

@BabkenVardanyan pylint nổi tiếng là nghiêm ngặt khi nói đến phong cách mã. Tôi muốn giới thiệu flake8hoặc pyflakesđể không mất cả ngày của bạn với những cảnh báo vô nghĩa.
jmagnusson

6

Đây là một đoạn mã tôi đặt trong các tập lệnh của mình mà tôi sẽ không chạy trong môi trường không xác định 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)

Bây giờ bạn có thể sử dụng real_raw_input. Nó khá đắt nhưng ngắn và dễ đọc. Sử dụng đầu vào thô thường tốn thời gian (chờ đầu vào), vì vậy nó không quan trọng.

Về lý thuyết, bạn thậm chí có thể gán raw_input thay vì real_raw_input nhưng có thể có các mô-đun kiểm tra sự tồn tại của raw_input và hành xử tương ứng. Tốt hơn hết là ở bên an toàn.


Tôi có được điều này khi tôi đã thử nó: inputcons = VAR ( dựng sẵn ) .get ( 'raw_input', đầu vào) Lỗi Loại: vars () lập luận phải có dict thuộc tính

0

Có lẽ không phải là giải pháp tốt nhất, nhưng trước khi đến đây tôi chỉ thực hiện điều này một cách nhanh chóng để tiếp tục làm việc mà không phải nghỉ học nhanh.

def raw_input(x):
  input(x)

Sau đó, khi tôi chạy raw_input('Enter your first name: ')trên kịch bản mà tôi đang làm việc, nó sẽ ghi lại nó input().

Có thể có một lý do để không làm điều này, mà tôi chưa đi qua!


7
Tại sao không chỉ raw_input = input?
tonypdmtr
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.