2008-09-16 24 views
335

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

+6

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

+2

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ụ: 'argparse' thay vì' optparse'. – HelloGoodbye

Trả lời

275

Để đọc đầu vào người dùng mà bạn có thể thử the cmd module để 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 (input cho 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 nằm 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 cho phân tích tùy chọn dòng lệnh: optparse (bị phản đối từ Python 2.7, sử dụng argparse thay) và getopt. Nếu bạn chỉ muốn nhập tệp vào tập lệnh của mình, hãy xem sức mạnh của fileinput.

Python library reference là bạn của bạn.

+57

'raw_input' được đổi tên thành' input' trong Python 3.x - [tài liệu ở đây] (http://docs.python.org/py3k/whatsnew/3.0.html#builtins) – steampowered

+1

Yêu thích của tôi nguồn cho điều này: http://www.tutorialspoint.com/python/python_command_line_arguments.htm và điều này cũng tốt: http://www.cyberciti.biz/faq/python-command-line-arguments-argv-example/ –

+0

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

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

Hoặc cho Python 3:

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

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

+1

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

29

Cách tốt nhất để xử lý đối số dòng lệnh là argparse module.

Sử dụng raw_input() để có được đầu vào người dùng. Nếu bạn nhập readline module, người dùng của bạn sẽ có chỉnh sửa và lịch sử dòng.

+0

readline chỉ có sẵn trên unix ra khỏi hộp mặc dù. –

+4

argparse là optparse mới –

7

Sử dụng 'raw_input' cho đầu vào từ bảng đ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 ví dụ, ví dụ:

$ 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

14

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

6

Tính đến Python 3.2 2.7, hiện nay argparse là để xử lý đối số dòng lệnh.

+1

argparse cũng đã được backported và có sẵn trên PyPi http://pypi.python.org/pypi/argparse/1.2.1 –

193

raw_input không còn có sẵn bằng Python 3.x. Nhưng raw_input đã được đổi tên thành input, vì vậy chức năng tương tự tồn tại.

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

Documentation of the change

+23

Trong Python 2.7, đầu vào() 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 điều này: input_variable1 = input ("Nhập từ hoặc cụm từ đầu tiên:"), bạn sẽ gặp lỗi: Traceback (cuộc gọi gần đây nhất): return eval (raw_input (prompt)) Tệp "", dòng 1, trong TênError: tên 'xấu' không được xác định –

+0

input_var = input ("Nhấn 'E' và 'Enter' để thoát:") NameError: name 'e' không được định nghĩa 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. –

+0

Bạn có thể tránh được thông báo Traceback bằng cách sử dụng việc nhập khẩu sau đó đi kèm với Python 2.7: 'nhập khẩu fileinput result = [] cho dòng trong fileinput.input(): \t result.append (dòng) ' –

8

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

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

The following code is a Python program that takes a list of integers and produces either the sum or the max:

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) 
8

chương trình đơn giản này sẽ giúp bạn trong việc tìm hiểu làm thế nào để nuôi đầu vào người dùng từ dòng lệnh và hiển thị giúp đỡ về truyền tham 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) Đi qua lập luận hợp lệ khác hơn con 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'> 
4

Nếu đó là một phiên bản 3.x sau đó chỉ đơn giản là sử dụng:

variantname = input() 

Ví dụ: yo u muốn nhập 8:

x = input() 
8 

x sẽ bằng 8 nhưng sẽ là chuỗi trừ khi bạn xác định khác.

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

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

Trong Python 2:

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

Trong Python 3:

data = input('Enter something: ') 
print(data) 
Các vấn đề liên quan