Что означает «sys.argv»? - PullRequest
       96

Что означает «sys.argv»?

5 голосов
/ 26 февраля 2012

Я учусь на коде, и меня смущает одна из его строк:

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

Я искал в Интернете и пытался понять, что означает sys.arg, и вот мое понимание:

То есть sys.argv[0] - это имя файла, а sys.argv[1:] - это остальные параметры, которые должны предоставить пользователи. Я не уверен, что я правильно понял, и если это так, то я не понимаю, почему это не так:

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

В чем разница между этими двумя способами задания параметров?

Кроме того, если я запускаю код (нажмите F5 ), оболочка Python выдаст мне ошибку, подобную:

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

Мне даже не дали возможности указать параметры (sys.argv[1:]), прежде чем это дало мне ошибку. Поэтому я искал в Интернете. Похоже, мне нужно запустить этот код в cmd, что меня больше смутило, зачем это нужно и как мне поместить в cmd, чтобы запустить его?

Ответы [ 4 ]

5 голосов
/ 26 февраля 2012

Разница в том, что параметры sys.argv (командная строка) перед запуском программы (при ее запуске) задаются:

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

В результате ваши переменные будут:

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

Хотя input() s задаются при запуске программы.

Поскольку вы не запускаете программу с параметрами, она выдает ошибку, потому что не хватает (ровно 0) параметровбыть распакованным в переменные.

2 голосов
/ 26 февраля 2012

Все остальные ответы объяснили sys.argv просто отлично, но я думаю, что была часть фундаментальной терминологии, которая отсутствовала.Я просто хотел добавить, что ...

input() говорит вашей программе читать из stdin .

Это похоже на чтение из файла и является потоком.Вызов input() читает до новой строки.Вы также можете читать stdin до тех пор, пока не будет достигнут EOF ( конец файла ).

sys.argv с другой стороны, это просто список, доступный вам из системысодержит все аргументы, которые были использованы для вызова команды из оболочки.Технически существует некоторый тип ограничения (для каждой системы) максимального числа аргументов , которые можно передать в командной строке , поэтому существует команда xargs (для вызоваваша команда с пакетами ваших аргументов, разделить).

stdin

echo "I am stdin" | myCommand.py

... Что такое понятие под капотом, что и это после ПОСЛЕ вашегоПрограмма работает:

read_from_stdin = input()

args

myCommand.py "I am an arg"

И, наконец, чтение из stdin / input() не будет автоматическиразбить свои слова в список.Есть дополнительные методы для чтения по строке, которые вы можете использовать.Но вы также можете читать по символам, определенное количество символов за раз или весь объем данных одновременно.

2 голосов
/ 26 февраля 2012

sys.argv называются «параметрами командной строки». Если вы хотите передать их, вы должны запустить свой скрипт из командной строки. В системе Windows команда будет выглядеть так:

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

где «cmd>» - это приглашение, которое вы получаете после использования «Пуск» -> «Выполнить».

1 голос
/ 26 февраля 2012

Параметры не совпадают с вводом программы.Например, здесь wget используется с параметрами:

$ wget "I am a parameter!"

Здесь cat используется с входом:

$ cat
Now you type. This is the input.

Это также причина вашей ошибки - вы не можетеукажите параметры как таковые после запуска программы.

...