2012-02-26 47 views
6

tôi đang học từ mã, và tôi bị lẫn lộn bởi một trong những dây chuyền của nó đó là:'sys.argv' có nghĩa là gì?

things = [float(arg) for arg in sys.argv[1:]] 
Omega_a, Omega_b, Delta_a, Delta_b, \ 
init_pop_a, init_pop_b, tstep, tfinal = things 

Tôi đã tìm kiếm trực tuyến và cố gắng hiểu những gì sys.arg phương tiện, và đây là sự hiểu biết của tôi:

Vì vậy, sys.argv[0] là tên tệp và sys.argv[1:] là phần còn lại của các thông số mà người dùng phải cung cấp. Tôi không chắc mình có hiểu đúng không, và nếu có, thì tôi không hiểu tại sao nó không thể như sau:

Omega_a = input() 
Omega_b = input() 
etc... 

Sự khác biệt giữa hai cách đưa ra tham số là gì?

Ngoài ra, nếu tôi chạy mã (nhấn F5 ), vỏ Python cho tôi một lỗi như:

Traceback (most recent call last): 

File "C:\Users\testcode.py", line 55, in <module> 
init_pop_a, init_pop_b, tstep, tfinal = things 
ValueError: need more than 0 values to unpack 

Tôi thậm chí còn không có cơ hội để cung cấp cho các thông số (sys.argv[1:]) trước khi nó đã cho tôi một lỗi. Vì vậy, tôi đã tìm kiếm trực tuyến. Dường như tôi cần phải chạy mã này trong cmd mà tôi nhầm lẫn nhiều hơn, tại sao nên nó và làm thế nào tôi nên đưa vào cmd để chạy nó?

Trả lời

6

Sự khác biệt là, rằng sys.argv (dòng lệnh) các thông số được đưa ra trước khi chương trình đang chạy (khi bắt đầu nó):

python testcode.py arg1 arg2 arg3 arg4 and so on ... 

Điều này sẽ dẫn đến các biến của bạn là:

Omega_a = 'arg1' 
Omega_b = 'arg2' 
Delta_a = 'arg3' 
Delta_b = 'arg4' 
init_pop_a = 'and' 
init_pop_b = 'so' 
tstep = 'on' 
tfinal = '...' 

Trong khi các input() s được đưa ra khi chương trình đang chạy.

Vì bạn không khởi động chương trình với các tham số, nó cung cấp cho bạn lỗi, vì không có đủ (chính xác 0) tham số được giải nén vào các biến.

+0

ah! được rồi, tôi hiểu rồi. – user1233157

1

Thông số không giống như đầu vào chương trình. Ví dụ, đây là wget sử dụng với các thông số:

$ wget "I am a parameter!" 

Dưới đây là cat sử dụng với đầu vào:

$ cat 
Now you type. This is the input. 

Đó là lý do cho lỗi của mình - bạn không thể chỉ định các thông số như vậy sau khi bạn chạy chương trình.

2

sys.argv được gọi là "tham số dòng lệnh". Nếu bạn muốn vượt qua chúng, bạn nên chạy kịch bản lệnh từ một dòng lệnh. Trên hệ thống Windows, lệnh sẽ trông giống như:

cmd> python C:\Users\testcode.py arg1 args2 

trong đó "cmd>" là lời nhắc bạn nhận được sau khi sử dụng "Bắt đầu" -> "Chạy".

2

Tất cả các câu trả lời khác được giải thích sys.argv tốt, nhưng tôi nghĩ rằng có một phần thuật ngữ cơ bản bị thiếu. Tôi chỉ muốn thêm điều đó ...

input() yêu cầu chương trình của bạn đọc từ stdin.

Giống như đọc từ một tệp và là một luồng. Cuộc gọi input() đọc cho đến khi đạt đến một dòng mới. Bạn cũng có thể đọc stdin cho đến khi đạt được EOF (end of file).

sys.argv mặt khác chỉ đơn giản là một danh sách được tạo sẵn cho bạn từ hệ thống chứa tất cả các đối số được sử dụng để gọi lệnh từ trình bao. Về mặt kỹ thuật, có một số loại giới hạn (trên cơ sở từng hệ thống) đến maximum number of arguments that can be passed on the command line, đó là lý do tại sao lệnh xargs tồn tại (để gọi lệnh của bạn với các lô đối số của bạn, được chia nhỏ).

stdin

echo "I am stdin" | myCommand.py

... Đó là những khái niệm tương tự dưới mui xe như làm điều này sau khi chương trình của bạn đang chạy:

read_from_stdin = input()

args

myCommand.py "I am an arg"

Và cuối cùng, đọc từ stdin/input() sẽ không tự động chia các từ của bạn thành một danh sách. Có thêm các phương pháp để đọc theo từng dòng mà bạn có thể sử dụng. Nhưng bạn cũng có thể đọc theo ký tự, số lượng ký tự cụ thể tại một thời điểm hoặc toàn bộ số lượng dữ liệu cùng một lúc.

+0

'đầu vào()' đọc một dòng, không cho đến khi EOF. – kindall

+0

@kindall - Cảm ơn bạn đã sửa! Tôi đã chỉnh sửa dòng đó. – jdi