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

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

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, чтобы запустить его?


person user1233157    schedule 26.02.2012    source источник


Ответы (4)


Отличие в том, что параметры 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) параметров для распаковки в переменные.

person Nobody moving away from SE    schedule 26.02.2012

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

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

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

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

стандартный ввод

echo "I am stdin" | myCommand.py

... Это та же концепция под капотом, что и после запуска вашей программы:

read_from_stdin = input()

аргументы

myCommand.py "I am an arg"

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

person jdi    schedule 26.02.2012

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

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

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

person Roman Bodnarchuk    schedule 26.02.2012

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

$ wget "I am a parameter!"

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

$ cat
Now you type. This is the input.

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

person Ry-♦    schedule 26.02.2012