sys.argv [1] có nghĩa trong kịch bản


146

Tôi hiện đang tự học Python và chỉ đang tự hỏi (Tham khảo ví dụ của tôi dưới đây) bằng các thuật ngữ đơn giản hóa những gì sys.argv[1]đại diện. Có phải nó chỉ đơn giản là yêu cầu một đầu vào?

#!/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()

2
Điều nà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 lập luận , có lẽ tốt hơn cho những gì bạn đang cố gắng làm, theo điều này
llrs

Câu trả lời:


334

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


1
Khi bạn hiển thị danh sách các chuỗi sys.argv, tôi tự hỏi dòng from __future__ import print_functionnày làm gì. Đây có phải là thứ tôi phải thêm nếu tôi KHÔNG chạy trên Python 3 mà là Python 2 không? @Jason R. Coombs
Nicholas

1
@NicholasLiu, bạn không cần thêm nó nếu bạn đang dùng Python 3. Tôi đã thêm nó cho đầy đủ. 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.
Jason R. Coombs

@ JasonR.Coombs Tôi nhầm lẫn với cái này : sys.argv **is** automatically a list of strings. Bạn có nghĩa là "cho" hoặc "trả lại"?
JinSnow

1
@Guillaume: Đó là một sự khác biệt về ngữ nghĩa tinh tế, nhưng trong Python, các tên như sys.argv giữ các tham chiếu đến các đối tượng. Vì vậy, về mặt kỹ thuật, argvthuộc tính của sysmô-đun là một tham chiếu đến một đối tượng danh sách có chứa các chuỗi của các đối số. Để sử dụng giveshoặc returnssẽ đề xuất một lệnh gọi hàm hoặc trình tạo hoặc cấu trúc khác. referenceshoặc representscó thể là các thuật ngữ chính xác hơn, nhưng isđủ gần.
Jason R. Coombs

@ JasonR.Coombs điều gì xảy ra nếu tôi gọi trực tiếp mainbằng cách nhập mô-đun (giả sử tên mô-đun là moduleA.py) và gọi hàm như trong import moduleA; moduleA.main(). Trong trường hợp đó, không có đối số dòng lệnh .. vì vậy sys.argv[0]vẫn được cho là đại diện cho filenamenghĩa. nó nên in ra moduleA.py?
alpha_989

34

sys.argv [1] chứa đối số dòng lệnh đầu tiên được truyền cho tập lệnh của bạn.

Ví dụ: nếu tập lệnh của bạn được đặt tên hello.pyvà bạn phát hành:

$ python3.1 hello.py foo

hoặc là:

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

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

Xin chào

Tôi phải chạy lệnh này: exec py C: \\ project-open \\ server \\ projop \\ gói \\ intranet-timesheet2 \\ www \\ hours \\ y.py Có cách nào để sử dụng đường dẫn tương đối cho tập tin trăn?
yaksh

25

sys.argv là một danh sách.

Danh sách này được tạo bởi dòng lệnh của bạn, 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 nhập một cái gì đó 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 trường hợp này sys.argv[1] = 'something'


12

Chỉ cần thêm vào câu trả lời của Frederic, ví dụ nếu bạn gọi tập lệnh của mình 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à cứ thế.

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à "Xin chào có foo".


9

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 như một danh sách các chuỗi như (được đề cập bởi Jason). Vì vậy, tất cả các thao tác danh sách sẽ được áp dụng ở đây. Điều này được gọi là "Danh sách cắt". Để biết thêm thông tin truy cập tại đây .

Cú pháp như sau: list [start: end: step]. 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 theo chiều dài của danh sách.

Giả sử bạn chỉ muốn nhận tất cả các đối số sau đối số 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 đối số 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 kết thúc, không bước):

user_args = sys.argv[-1]

Giả sử bạn muốn đối số 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ả sử bạn muốn hai đối số cuối cùng. Ở đây, bắt đầu là -2, đó là mục cuối cùng thứ hai và sau đó đến cuối (ký hiệu là ":"):

user_args = sys.argv[-2:]

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

user_args = sys.argv[:-2]

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

user_args = sys.argv[::-1]

Hi vọng điêu nay co ich.


4

sys.argv là một danh sách chứa các đối số dòng lệnh và 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 đây là đối số.


3

Để truyền đối số cho tập lệnh python của bạn trong khi chạy tập lệnh thông qua dòng lệnh

python created_thumbnail.py test1.jpg test2.jpg

ở đây, tên tập lệnh - created_thumbnail.py, đối số 1 - test1.jpg, đối số 2 - test2.jpg

Với trong tập lệnh create_thumbnail.py tôi sử dụng

sys.argv[1:]

cung cấp cho tôi danh sách các đối số tôi đã truyền trong dòng lệnh là ['test1.jpg', 'test2.jpg']


1

sys.argvlà một thuộc tính của sysmô-đun. Nó nói rằng các đối số được truyền vào tệp trong dòng lệnh. sys.argv[0]bắt thư mục chứa tập tinsys.argv[1]trả về đối số đầu tiên được truyền trong dòng lệnh. Hãy suy nghĩ như chúng ta có một tập tin example.txt.

example.py

import sys # Importing the main sys module to catch the arguments
print(sys.argv[1]) # Printing the first argument

Bây giờ ở đây trong dấu nhắc lệnh khi chúng ta làm điều này:

python example.py

Nó sẽ đưa ra một lỗi chỉ mục ở dòng 2. Nguyên nhân là không có đối số nào được thông qua. Bạn có thể thấy độ dài của các đối số được người dùng chuyển qua sử dụng if len(sys.argv) >= 1: # Code. Nếu chúng ta chạy example.txt với việc truyền đối số

python example.py args

Nó in:

args

Bởi vì đó là cuộc tranh cãi đầu tiên! Giả sử chúng ta đã biến nó thành một tệp thực thi bằng PyInstaller. Chúng tôi sẽ làm điều này:

example argumentpassed

Nó in:

argumentpassed

Nó thực sự hữu ích khi bạn thực hiện một lệnh trong thiết bị đầu cuối. Đầu tiên kiểm tra độ dài của các đối số. Nếu không có đối số nào được thông qua, hãy làm văn bản trợ giúp.


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 khi chạy từ terminal.

Hãy thử điều này:

import sys
print sys.argv

argv lưu trữ 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ố được thông qua sẽ chạy tập lệnh.

Bây giờ hãy thử điều này chạy filename.txt của bạn như thế này:

python filename.py example example1

Điều 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 được thông qua, trong trường hợp này là 'ví dụ'

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

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.