我正在从代码中学习,我对其中的一行感到困惑:
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才能运行它?
答案 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.
这也是导致错误的原因 - 运行程序后无法指定参数。