Tôi muốn lưu ý rằng các câu trả lời trước đó đã đư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 hơn.
Đối với mọi lệnh gọi của Python, sys.argvsẽ tự động là một danh sách các chuỗi biểu thị các đối số (được phân tách bằng khoảng trắng) trên dòng lệnh. Tên này xuất phát từ quy ước lập trình C 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 làm quen với Python, nhưng trong lúc này, đây là một vài điều cần biết.
Bạn có thể chỉ cần tạo một tập lệnh in các đối số như chúng được trình bày. Nó cũng in số lượng đối số, sử dụng lenhàm trong danh sách.
from __future__ import print_function
import sys
print(sys.argv, len(sys.argv))
Kịch bản yêu cầu Python 2.6 trở lên. Nếu bạn gọi tập lệnh này print_args.py, bạn có thể gọi nó với 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, các đối số dòng lệnh bao gồm tên tập lệnh nhưng không phải tên trình thông dịch. Theo nghĩa này, Python coi tập lệnh là tệp thực thi. Nếu bạn cần biết tên của tệp thực thi (python 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á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 gói gọn 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 của bạn, 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ì các danh sách được lập chỉ mục bởi các số nguyên dựa trên số không, bạn có thể nhận các mục riêng lẻ bằ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ù thú vị, bạn hiếm khi cần biết tên kịch bản của mình. Để có được đối số đầu tiên sau tập lệnh cho tên tệp, 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 IndexError nếu không có đối số nào được cung cấp.
Ngoài ra, Python cho phép bạn tham chiếu một lát của danh sách, vì vậy để có được một danh sách khác chỉ các đối số do người dùng cung cấp (nhưng không có tên tập lệnh), bạn có thể làm
user_args = sys.argv[1:] # get everything after the script name
Ngoài ra, Python cho phép bạn gán một chuỗi các mục (bao gồm danh sách) cho các tên biến. Vì vậy, nếu bạn mong muốn người dùng luôn cung cấp hai đối số, bạn có thể gán các đối số đó (dưới dạng chuỗi) cho hai biến:
user_args = sys.argv[1:]
fun, games = user_args # len(user_args) had better be 2
Vì vậy, để trả lời câu hỏi cụ thể của bạn, hãy trình sys.argv[1]bày đối số dòng lệnh đầu tiên (dưới dạng string) được cung cấp cho tập lệnh đang đề cập. Nó sẽ không nhắc nhập, nhưng nó sẽ thất bại với IndexError nếu không có đối số nào được cung cấp trên dòng lệnh theo tên tập lệnh.