5

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

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

4 回答 4

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()s 在程序运行时给出。

由于您没有使用参数启动程序,它会给您错误,因为没有足够的(正好为 0)参数可以解压缩到变量中。

于 2012-02-26T17:11:03.267 回答
2

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

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

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

于 2012-02-26T17:12:04.370 回答
2

所有其他答案都解释sys.argv得很好,但我认为缺少一些基本术语。我只是想补充一点...

input()告诉您的程序从stdin读取。

这就像从文件中读取,并且是一个流。input()调用读取直到到达换行符。您也可以阅读stdin直到到达 EOF(文件结尾)。

sys.argv另一方面,它只是一个列表,系统提供给您,其中包含用于从 shell 调用命令的所有参数。从技术上讲,可以在命令行上传递的最大参数数量有某种类型的限制(逐个系统),这就是该xargs命令存在的原因(用您的参数批量调用您的命令,拆分向上)。

标准输入

echo "I am stdin" | myCommand.py

...这与在程序运行后执行此操作的概念相同:

read_from_stdin = input()

参数

myCommand.py "I am an arg"

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

于 2012-02-26T17:29:08.167 回答
1

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

$ wget "I am a parameter!"

这里cat与输入一起使用:

$ cat
Now you type. This is the input.

这也是你的错误的原因 - 你不能在运行程序后指定参数。

于 2012-02-26T17:10:21.360 回答