'sys.argv'是什么意思?

时间:2012-02-26 17:06:29

标签: python cmd argv sys

我正在从代码中学习,我对其中的一行感到困惑:

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 shell会出现如下错误:

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 个答案:

答案 0 :(得分:5)

不同之处在于,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()

由于你没有用参数启动程序,它会给你错误, 因为没有足够的(确切地说是0个)参数被解压缩到变量中。

答案 1 :(得分:2)

sys.argv被称为“命令行参数”。如果要传递它们,则应该从命令行运行脚本。在Windows系统上,命令如下所示:

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

其中“cmd&gt;”是使用“开始” - &gt;“运行”后得到的提示。

答案 2 :(得分:2)

所有其他答案都解释sys.argv就好了,但我认为有一条基本术语缺失了。我只想补充一点......

input()告诉您的计划从stdin开始阅读。

就像从文件中读取并且是一个流。 input()调用将一直读取,直到达到换行符。您还可以阅读stdin,直到达到EOF(end of file)。

另一方面,

sys.argv只是一个列表,可以从系统中使用,包含用于从shell调用命令的所有参数。从技术上讲,maximum number of arguments that can be passed on the command line存在某种类型的限制(在逐个系统的基础上),这就是xargs命令存在的原因(用批量的参数调用命令,拆分)

标准输入

echo "I am stdin" | myCommand.py

......在你的程序运行之后,这与启动时的概念相同:

read_from_stdin = input()

ARGS

myCommand.py "I am an arg"

最后,从stdin / input()阅读不会自动将您的文字拆分为列表。您可以使用额外的逐行阅读方法。但您也可以按字符读取,一次读取特定数量的字符,或一次读取全部数据。

答案 3 :(得分:1)

参数与程序输入不同。例如,这里的wget与参数一起使用:

$ wget "I am a parameter!"

此处cat与输入一起使用:

$ cat
Now you type. This is the input.

这也是导致错误的原因 - 运行程序后无法指定参数。