'sys.argv' 是什么意思?

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中运行?如何将其放入cmd中并运行呢?

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()会提供输入。

如果您没有使用参数启动程序,则会出现错误,因为没有足够的(确切地说是0个)参数可以解包到变量中。


2

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

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

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


2
所有其他答案都很好地解释了sys.argv,但我认为缺少了一个基本术语。我只想补充一下... input() 告诉你的程序从标准输入读取。
它就像从文件中读取一样,是一个流。 input() 调用会一直读取,直到达到换行符。你也可以一直读取 stdin 直到遇到 EOF (文件结尾)。
另一方面,sys.argv 简单地是一个列表,由系统提供给你,其中包含从 shell 调用命令时使用的所有参数。从技术上讲,每个系统都有一些类型的限制,限制了可以通过命令行传递的最大参数数量,这就是为什么存在 xargs 命令(将您的命令与批处理的参数拆分调用)。
标准输入

echo "I am stdin" | myCommand.py

的意思是将字符串 "I am stdin" 通过标准输入传递给 myCommand.py 命令。在程序运行后,使用 read_from_stdin = input() 可以实现相同的功能。

如果使用 myCommand.py "I am an arg" 这种方式传递参数,则需要注意的是,从 stdin/input() 中读取数据时,并不会自动将单词分割成列表。可以使用额外的方法按行读取数据,也可以按字符、指定数量的字符或一次性读取全部数据。


1

参数与程序输入不同。例如,这是使用参数的wget

$ wget "I am a parameter!"

以下是使用 cat 与输入一起使用的示例:

$ cat
Now you type. This is the input.

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接