2010-11-07 52 views
74

Tôi hiện đang tự dạy mình Python và chỉ đang tự hỏi (Trong tham chiếu đến ví dụ của tôi dưới đây) trong các thuật ngữ đơn giản những gì sys.argv [1] đại diện. Nó chỉ đơn giản là yêu cầu một đầu vào?sys.argv [1] có nghĩa là trong kịch bản

#!/usr/bin/python3.1 

# import modules used here -- sys is a very standard one 
import sys 

# Gather our code in a main() function 
def main(): 
    print ('Hello there', sys.argv[1]) 
    # Command line args are in sys.argv[1], sys.argv[2] .. 
    # sys.argv[0] is the script name itself and can be ignored 

# Standard boilerplate to call the main() function to begin 
# the program. 
if __name__ == '__main__': 
    main() 
+0

Đâ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

Trả lời

212

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 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.

+0

Khi bạn hiển thị danh sách các chuỗi 'sys.argv', tôi tự hỏi dòng nào' từ __future__ import print_function'. Có phải cái gì tôi phải thêm nếu tôi ** KHÔNG ** chạy trên Python 3 nhưng Python 2? @ Jason R. Coombs – Nicholas

+1

@NicholasLiu, bạn không cần thêm nó nếu bạn đang sử dụng Python 3. Tôi đã thêm nó để hoàn thành. Hãy thử chạy mà không có nó trên Python 2 và bạn sẽ nhận được kết quả khác với những gì tôi mô tả. Hãy thử một lần. –

+0

@ JasonR.Coombs Tôi nhầm lẫn với điều này: 'sys.argv ** là ** tự động một danh sách các chuỗi'. Bạn có nghĩa là "cho" hoặc "trở lại"? – JinSnow

26

sys.argv[1] chứa đầu tiên command lineargument truyền cho kịch bản của bạn.

Ví dụ, nếu kịch bản của bạn được đặt tên hello.py và bạn phát hành:

$ python3.1 hello.py foo

hay:

$ chmod +x hello.py # make script executable 
$ ./hello.py foo 

Kịch bản của bạn sẽ in:

Hello there foo
3

sys.argv là một danh sách chứa đường dẫn tập lệnh và đối số dòng lệnh; tức là sys.argv [0] là đường dẫn của tập lệnh bạn đang chạy và tất cả các thành viên sau đều là đối số.

10

Chỉ cần thêm vào câu trả lời của Frederic, ví dụ nếu bạn gọi kịch bản của bạn như sau:

./myscript.py foo bar

sys.argv[0] sẽ là "./myscript.py" sys.argv[1] sẽ là "foo" và sys.argv[2] sẽ là "bar" ... và vân vân.

Trong mã ví dụ của bạn, nếu bạn gọi tập lệnh như sau ./myscript.py foo, đầu ra của tập lệnh sẽ là "Hello there foo".

13

sys.argv là danh sách.

Danh sách này được tạo bởi dòng lệnh của bạn, đó là danh sách các đối số dòng lệnh của bạn.

Ví dụ:

trong dòng lệnh của bạn, bạn điều gì đó đầu vào như thế này,

python3.2 file.py something 

sys.argv sẽ trở thành một danh sách [ 'file.py', 'cái gì đó']

Trong này case sys.argv[1] = 'something'

6

Thêm một vài điểm nữa vào câu trả lời của Jason:

Để lấy tất cả các đối số do người dùng cung cấp: user_args = sys.argv[1:]

Hãy xem sys.argv dưới dạng danh sách các chuỗi như (được Jason đề cập). Vì vậy, tất cả các thao tác trong danh sách sẽ áp dụng ở đây. Điều này được gọi là "List Slicing". Để biết thêm thông tin, hãy truy cập here.

Cú pháp giống như sau: danh sách [bắt đầu: kết thúc: bước]. Nếu bạn bỏ qua bắt đầu, nó sẽ mặc định là 0, và nếu bạn bỏ qua kết thúc, nó sẽ mặc định chiều dài của danh sách.

Giả sử bạn chỉ muốn đưa tất cả các đối số sau khi tranh luận thứ 3, sau đó:

user_args = sys.argv[3:] 

Giả sử bạn chỉ muốn hai đối số đầu tiên, sau đó:

user_args = sys.argv[0:2] or user_args = sys.argv[:2] 

Giả sử bạn muốn lập luận 2 đến 4:

user_args = sys.argv[2:4] 

Giả sử bạn muốn đối số cuối cùng (đối số cuối cùng luôn là -1, vì vậy những gì đang xảy ra ở đây là chúng ta bắt đầu đếm từ phía sau. Vì vậy, bắt đầu là cuối cùng, không có kết thúc, không có bước):

user_args = sys.argv[-1] 

Giả sử bạn muốn tranh luận cuối cùng thứ hai:

user_args = sys.argv[-2] 

Giả sử bạn muốn hai đối số cuối cùng:

user_args = sys.argv[-2:] 

Giả bạn muốn hai đối số cuối cùng. Ở đây, bắt đầu bằng -2, đó là mục cuối cùng thứ hai và sau đó đến cuối (được biểu thị bằng ":"):

user_args = sys.argv[-2:] 

Giả sử bạn muốn mọi thứ trừ hai đối số cuối cùng. Ở đây, bắt đầu là 0 (mặc định), và cuối cùng là thứ hai mục cuối cùng:

user_args = sys.argv[:-2] 

Giả sử bạn muốn các đối số theo thứ tự ngược:

user_args = sys.argv[::-1] 

Hope this helps.

2

Để vượt qua các đối số cho kịch bản python của bạn trong khi chạy một kịch bản thông qua dòng lệnh

python create_thumbnail.py test1.jpg test2.jpg

đây, tên kịch bản - create_thumbnail.py, đối số 1 - test1.jpg, đối số 2 - test2.jpg

Với trong kịch bản create_thumbnail.py tôi sử dụng

sys.argv[1:] 

mà đưa cho tôi danh sách các đối số i thông qua vào dòng lệnh như [ 'test1.jpg', 'test2.jpg']

0

sys .argv sẽ hiển thị dòng lệnh args được truyền khi chạy tập lệnh hoặc bạn có thể nói sys.argv sẽ lưu trữ các đối số dòng lệnh được truyền trong python trong khi chạy từ thiết bị đầu cuối.

Chỉ cần cố gắng này:

import sys 
print sys.argv 

cửa hàng argv tất cả các đối số được truyền trong một danh sách python.Ở trên sẽ in tất cả các đối số thông qua sẽ chạy kịch bản.

Bây giờ thử loại này chạy filename.py của bạn như thế này:

python filename.py example example1 

này sẽ in 3 đối số trong một danh sách.

sys.argv[0] #is the first argument passed, which is basically the filename. 

Tương tự, argv 1 là đối số đầu tiên trôi qua, trong trường hợp này 'dụ'

Một câu hỏi tương tự đã được hỏi đã here btw. Hi vọng điêu nay co ich!

Các vấn đề liên quan