Какво означава „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, докато бъде достигнат EOF (края на файла).

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

stdin

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