Tôi muốn lưu ý rằng các câu trả lời trước đây đã đưa ra nhiều giả định về kiến thức của người dùng. Câu trả lời này cố gắng trả lời câu hỏi ở cấp độ hướng dẫn khác.
Đối với mọi lệnh gọi Python, sys.argv
tự động là danh sách các chuỗi đại diện cho các đối số (được phân cách bằng dấu cách) trên dòng lệnh. Tên đến từ C programming convention, trong đó argv và argc đại diện cho các đối số dòng lệnh.
Bạn sẽ muốn tìm hiểu thêm về danh sách và chuỗi khi bạn đã tự làm quen với Python, nhưng trong thời gian chờ đợi, đây là một vài điều cần biết.
Bạn chỉ có thể tạo tập lệnh in các đối số khi chúng được biểu diễn. Nó cũng in số lượng đối số, sử dụng hàm len
trong danh sách.
from __future__ import print_function
import sys
print(sys.argv, len(sys.argv))
Tập lệnh yêu cầu Python 2.6 hoặc mới hơn. Nếu bạn gọi kịch bản này là print_args.py
, bạn có thể gọi nó bằng các đối số khác nhau để xem điều gì xảy ra.
> python print_args.py
['print_args.py'] 1
> python print_args.py foo and bar
['print_args.py', 'foo', 'and', 'bar'] 4
> python print_args.py "foo and bar"
['print_args.py', 'foo and bar'] 2
> python print_args.py "foo and bar" and baz
['print_args.py', 'foo and bar', 'and', 'baz'] 4
Như bạn có thể thấy, đối số dòng lệnh bao gồm tên tập lệnh chứ không phải tên thông dịch viên. Theo nghĩa này, Python xử lý tập lệnh là thực thi. Nếu bạn cần biết tên của tệp thực thi (trăn trong trường hợp này), bạn có thể sử dụng sys.executable
.Bạn có thể thấy từ các ví dụ có thể nhận các đối số có chứa khoảng trống nếu người dùng gọi tập lệnh với các đối số được đóng gói trong dấu ngoặc kép, vì vậy những gì bạn nhận được là danh sách các đối số được cung cấp bởi người dùng.
Bây giờ trong mã Python, bạn có thể sử dụng danh sách các chuỗi này làm đầu vào cho chương trình của mình. Vì danh sách được lập chỉ mục bằng số nguyên dựa trên số không, bạn có thể lấy các mục riêng lẻ bằng cách sử dụng cú pháp danh sách [0]. Ví dụ: để lấy tên tập lệnh:
script_name = sys.argv[0] # this will always work.
Mặc dù điều thú vị là bạn hiếm khi cần biết tên tập lệnh của mình. Để có được số đầu tiên sau khi kịch bản cho một tên tập tin, bạn có thể làm như sau:
filename = sys.argv[1]
Đây là một cách sử dụng rất phổ biến, nhưng lưu ý rằng nó sẽ thất bại với một IndexError nếu không có tranh luận đã được cung cấp.
Ngoài ra, Python cho phép bạn tham khảo một lát một danh sách, vì vậy để có được danh sách khác chỉ các đối số người dùng cung cấp (nhưng mà không có tên kịch bản), bạn có thể làm
user_args = sys.argv[1:] # get everything after the script name
Bên cạnh đó, Python cho phép bạn gán một chuỗi các mục (bao gồm các danh sách) cho các tên biến. Vì vậy, nếu bạn mong đợi người dùng luôn luôn cung cấp hai đối số, bạn có thể gán những đối số (như dây đàn) để hai biến:
user_args = sys.argv[1:]
fun, games = user_args # len(user_args) had better be 2
Vì vậy, trong câu trả lời chính thức cho câu hỏi cụ thể của bạn, sys.argv[1]
đại diện cho đối số dòng lệnh đầu tiên (dưới dạng string
) được cung cấp cho tập lệnh được đề cập. Nó sẽ không nhắc nhở cho đầu vào, nhưng nó sẽ thất bại với một IndexError nếu không có đối số nào được cung cấp trên dòng lệnh sau tên kịch bản lệnh.
Đây không phải là một phần của câu hỏi và nó rất cũ nhưng mô-đun [argparse] (https://docs.python.org/2/library/argparse.html#module-argparse), có thể tốt hơn cho những gì bạn đang cố gắng làm, theo [this] (http://stackoverflow.com/q/1009860/2886003) – Llopis