Đầu vào của người dùng và đối số dòng lệnh [đã đóng]


525

Làm cách nào để tôi có một tập lệnh Python mà a) có thể chấp nhận đầu vào của người dùng và làm cách nào để làm cho nó b) đọc trong các đối số nếu chạy từ dòng lệnh?


9
Câu trả lời sẽ phụ thuộc vào phiên bản Python của bạn. Python 3.x hiện một này chút khác biệt so với Python 2.7
steampowered

4
Và Python 2.7 cũng thực hiện điều này khác một chút so với các phiên bản trước 2.7, ví dụ argparsethay vì optparse.
HelloGoodbye

Câu trả lời:


501

Để đọc đầu vào người dùng mà bạn có thể thử các cmdmô-đun để dễ dàng tạo ra một dòng thông dịch viên mini-lệnh (với văn bản trợ giúp và autocompletion) và raw_input( inputcho Python 3+) để đọc một dòng văn bản từ người dùng.

text = raw_input("prompt")  # Python 2
text = input("prompt")  # Python 3

Đầu vào dòng lệnh được trong sys.argv. Hãy thử điều này trong kịch bản của bạn:

import sys
print (sys.argv)

Có hai mô-đun để phân tích các tùy chọn dòng lệnh: optparse(không dùng nữa từ Python 2.7, sử dụng argparsethay thế) và getopt. Nếu bạn chỉ muốn nhập tập tin vào tập lệnh của mình, hãy xem sức mạnh của fileinput.

Các Python thư viện tham khảo là bạn của bạn.


71
raw_inputđược đổi tên thành inputbằng Python 3.x - tài liệu ở đây
steampowered

1
Nguồn yêu thích của tôi cho việc này: guidespoint.com/python/python_command_line_argument.htmlm và điều này cũng có vẻ tốt: cyberciti.biz/faq/python-command-line-argument-argv-example
Jordan Stewart

1
sys.argv cần được cung cấp với số đối số, nếu giả sử bạn truyền tham số dưới dạng giá trị, vd. python file_name.py 2017/02/10 và bạn muốn sử dụng ngày, nó phải là sys.argv [1] khác nó sẽ là một danh sách như [file_name.py, 2017/2/10]
Aravind Krishnakumar

467
var = raw_input("Please enter something: ")
print "you entered", var

Hoặc cho Python 3:

var = input("Please enter something: ")
print("You entered: " + var)

26
Cần lưu ý rằng bạn không phải nhập raw_input, đó là một hàm dựng sẵn.
Dennis Golomazov

7
Bạn không phải sử dụng str () trong ghép nối in vì tất cả dữ liệu đã nhập sẽ là loại str (ing) theo mặc định (số chẵn).
Goujon

202

raw_inputkhông còn có sẵn trong Python 3.x. Nhưng raw_inputđã được đổi tên input, vì vậy các chức năng tương tự tồn tại.

input_var = input("Enter something: ")
print ("you entered " + input_var) 

Tài liệu về sự thay đổi


24
Trong Python 2.7, input () không chuyển đổi giá trị thành chuỗi. Vì vậy, nếu bạn cố gắng thực hiện việc này: input_variable1 = input ("Nhập từ hoặc cụm từ đầu tiên:"), bạn sẽ gặp lỗi: TracBack (cuộc gọi gần đây nhất): return eval (raw_input (prompt)) Tệp "<chuỗi> ", Dòng 1, trong <mô-đun> TênError: tên 'xấu' không được xác định
IgorGanapolsky

input_var = input ("Nhấn 'E' và 'Enter' để thoát:") NameError: name 'e' không được xác định Tôi đang sử dụng Python 2.5. Làm thế nào, tôi có thể khắc phục lỗi này.
Deepak Dubey

Bạn có thể tránh thông báo TracBack bằng cách sử dụng lần nhập sau đi kèm với Python 2.7:import fileinput result=[] for line in fileinput.input(): result.append(line)
Stefan Gruenwald

Đây là nhiều hơn về lịch sử và lý do: python.org/dev/peps/pep-3111
Julian


18

Cẩn thận không sử dụng inputchức năng, trừ khi bạn biết những gì bạn đang làm. Không giống như raw_input, inputsẽ chấp nhận bất kỳ biểu hiện trăn nào, vì vậy nó giống nhưeval


15

Chương trình đơn giản này giúp bạn hiểu cách cung cấp đầu vào của người dùng từ dòng lệnh và để hiển thị trợ giúp về việc truyền đối số không hợp lệ.

import argparse
import sys

try:
     parser = argparse.ArgumentParser()
     parser.add_argument("square", help="display a square of a given number",
                type=int)
    args = parser.parse_args()

    #print the square of user input from cmd line.
    print args.square**2

    #print all the sys argument passed from cmd line including the program name.
    print sys.argv

    #print the second argument passed from cmd line; Note it starts from ZERO
    print sys.argv[1]
except:
    e = sys.exc_info()[0]
    print e

1) Để tìm căn bậc hai của 5

C:\Users\Desktop>python -i emp.py 5
25
['emp.py', '5']
5

2) Truyền đối số không hợp lệ ngoài số

C:\Users\bgh37516\Desktop>python -i emp.py five
usage: emp.py [-h] square
emp.py: error: argument square: invalid int value: 'five'
<type 'exceptions.SystemExit'>

10

Sử dụng 'raw_input' cho đầu vào từ bàn điều khiển / thiết bị đầu cuối.

nếu bạn chỉ muốn một đối số dòng lệnh như tên tệp hoặc một cái gì đó, vd

$ python my_prog.py file_name.txt

sau đó bạn có thể sử dụng sys.argv ...

import sys
print sys.argv

sys.argv là một danh sách trong đó 0 là tên chương trình, vì vậy trong ví dụ trên sys.argv [1] sẽ là "file_name.txt"

Nếu bạn muốn có đầy đủ các tùy chọn dòng lệnh, hãy sử dụng mô-đun optparse.

Pev


9

Nếu bạn đang chạy Python <2.7, bạn cần optparse , như tài liệu giải thích sẽ tạo giao diện cho các đối số dòng lệnh được gọi khi ứng dụng của bạn chạy.

Tuy nhiên, trong Python ≥2.7, optparse đã không được dùng nữa và được thay thế bằng argparse như được hiển thị ở trên. Một ví dụ nhanh từ các tài liệu ...

Đoạn mã sau là chương trình Python lấy danh sách các số nguyên và tạo tổng hoặc cực đại:

import argparse

parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('integers', metavar='N', type=int, nargs='+',
                   help='an integer for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const',
                   const=sum, default=max,
                   help='sum the integers (default: find the max)')

args = parser.parse_args()
print args.accumulate(args.integers)


6

Nếu đó là phiên bản 3.x thì chỉ cần sử dụng:

variantname = input()

Ví dụ: bạn muốn nhập 8:

x = input()
8

x sẽ bằng 8 nhưng nó sẽ là một chuỗi trừ khi bạn định nghĩa nó khác.

Vì vậy, bạn có thể sử dụng lệnh convert, như:

a = int(x) * 1.1343
print(round(a, 2)) # '9.07'
9.07

3

Trong Python 2:

data = raw_input('Enter something: ')
print data

Trong Python 3:

data = input('Enter something: ')
print(data)

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.