Làm cách nào để truy cập các đối số dòng lệnh trong Python?


362

Tôi sử dụng python để tạo thiết lập cài đặt dự án của mình, nhưng tôi cần trợ giúp để nhận các đối số dòng lệnh.

Tôi đã thử điều này trên thiết bị đầu cuối:

$python myfile.py var1 var2 var3

Trong tệp Python của tôi, tôi muốn sử dụng tất cả các biến là đầu vào.


1
Mô-đun baker là một công cụ tuyệt vời để viết các ứng dụng dòng lệnh Python. pypi.python.org/pypi/Baker/1.02
Spike Gronim

Câu trả lời:



115
import sys

sys.argv[1:]

sẽ cung cấp cho bạn một danh sách các đối số (không bao gồm tên của tệp python)


5
[1:]nghĩa là gì?
Hẻm núi Kolob

8
@KolobCanyon có nghĩa là "lấy một danh sách con bắt đầu từ chỉ số 1 cho đến hết", tức là bỏ qua phần tử đầu tiên
Kamil Jarosz

@KolobCanyon đưa đối số thứ hai [1:]lên trên bởi vì đối số đầu tiên sys.argvtheo mặc định là tên của tệp python mà bạn đang chạy chẳng hạn testrun.py.
Samuel Nde

95

Tôi thực sự khuyên bạn nên argparseđi kèm với Python 2.7 trở lên.

Các argparsemô-đun giảm mã tấm nồi hơi và làm cho mã của bạn mạnh mẽ hơn, bởi vì các module xử lý tất cả trường hợp sử dụng tiêu chuẩn (bao gồm cả lệnh con), tạo ra sự giúp đỡ và sử dụng cho bạn, kiểm tra và vệ sinh đầu vào sử dụng - tất cả những thứ bạn phải lo lắng về việc khi nào bạn đang sử dụng sys.argvphương pháp tiếp cận. Và nó là miễn phí (tích hợp).

Đây là một ví dụ nhỏ:

import argparse

parser = argparse.ArgumentParser("simple_example")
parser.add_argument("counter", help="An integer will be increased by 1 and printed.", type=int)
args = parser.parse_args()
print(args.counter + 1)

và đầu ra cho python prog.py -h

usage: simple_example [-h] counter

positional arguments:
  counter     counter will be increased by 1 and printed.

optional arguments:
  -h, --help  show this help message and exit

python prog.py 1như bạn mong đợi:

2

7
Câu trả lời chất lượng, không thực sự chắc chắn tại sao bất cứ ai ở đây sẽ sử dụng bất kỳ phương pháp tiếp cận nào khác được đưa ra ở đây. Đặc biệt là vì nó được xây dựng trong! Các bạn có những điều tốt hơn để làm hơn là phân tích cú pháp?
Bassinator

Chỉ cần đề cập đến cách bạn nên truy cập vào đối số cụ thể trong không gian tên args: args.count
MikeL

1
@Bassinator Trong trường hợp không cần phân tích cú pháp đối số.
giảm hoạt động

để sử dụng giá trị mặc định, không có giá trị cụ thể trong dòng lệnh, bạn có thể sử dụng một cái gì đó như: parser.add_argument('var3', nargs='?', type=int, default=3)var3 là một tham số tùy chọn, nếu bạn không chỉ định một giá trị trong dòng lệnh, bạn có thể truy cập vào var3 trong mã của mình, giá trị mặc định cho var3 = 3
Albicocco

56

Mã Python:

import sys

# main
param_1= sys.argv[1] 
param_2= sys.argv[2] 
param_3= sys.argv[3]  
print 'Params=', param_1, param_2, param_3

Cầu nguyện:

$python myfile.py var1 var2 var3

Đầu ra:

Params= var1 var2 var3 

24

Bạn có thể sử dụng sys.argvđể lấy các đối số dưới dạng một danh sách.

Nếu bạn cần truy cập các yếu tố riêng lẻ, bạn có thể sử dụng

sys.argv[i]  

iChỉ mục ở đâu , 0sẽ cung cấp cho bạn tên tệp python đang được thực thi. Bất kỳ chỉ số nào sau đó là các đối số được thông qua.


6

Nếu bạn gọi nó như thế này: $ python myfile.py var1 var2 var3

import sys

var1 = sys.argv[1]
var2 = sys.argv[2]
var3 = sys.argv[3]

Tương tự như mảng bạn cũng có sys.argv[0]luôn là thư mục làm việc hiện tại.


6
sys.argv[0]không phải là thư mục làm việc hiện tại. Đó là tên của tệp đang thực thi.
nhìn vào

5

Một số điều bổ sung mà tôi có thể nghĩ ra.

Như @allsyed đã nói sys.argv đưa ra một danh sách các thành phần (bao gồm tên chương trình), vì vậy nếu bạn muốn biết số lượng phần tử được truyền qua dòng lệnh, bạn có thể sử dụng len () để xác định nó. Dựa trên điều này, bạn có thể thiết kế các thông báo ngoại lệ / lỗi nếu người dùng không vượt qua số lượng tham số cụ thể.

Ngoài ra nếu bạn đang tìm kiếm một cách tốt hơn để xử lý các đối số dòng lệnh, tôi sẽ đề nghị bạn xem https://docs.python.org/2/howto/argparse.html

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.