sys.argv 在脚本中的含义

我目前在教自己的Python,只是想知道(参考下面的例子)简单地说sys.argv [1]代表什么。 它只是要求input?

#!/usr/bin/python3.1 # import modules used here -- sys is a very standard one import sys # Gather our code in a main() function def main(): print ('Hello there', sys.argv[1]) # Command line args are in sys.argv[1], sys.argv[2] .. # sys.argv[0] is the script name itself and can be ignored # Standard boilerplate to call the main() function to begin # the program. if __name__ == '__main__': main() 

我想指出,以前的答案对用户的知识做了许多假设。 这个答案试图在更多教程级别回答这个问题。

对于Python的每一次调用, sys.argv都是自动的在命令行中表示参数的string列表(用空格分隔)。 该名称来自C编程约定 ,其中argv和argc表示命令行参数。

在熟悉Python的时候,你会想学习更多关于列表和string的知识,但同时,这里还有一些事情要知道。

您可以简单地创build一个脚本,用于显示参数。 它还打印参数的数量,使用列表中的len函数。

 from __future__ import print_function import sys print(sys.argv, len(sys.argv)) 

该脚本需要Python 2.6或更高版本。 如果你调用这个脚本print_args.py ,你可以用不同的参数调用它来看看会发生什么。

 > python print_args.py ['print_args.py'] 1 > python print_args.py foo and bar ['print_args.py', 'foo', 'and', 'bar'] 4 > python print_args.py "foo and bar" ['print_args.py', 'foo and bar'] 2 > python print_args.py "foo and bar" and baz ['print_args.py', 'foo and bar', 'and', 'baz'] 4 

如您所见,命令行参数包括脚本名称,但不包括解释器名称。 在这个意义上,Python把脚本当作可执行文件。 如果你需要知道可执行文件的名称(在这个例子中是python),你可以使用sys.executable

你可以从例子中看到,如果用户调用带有用引号封装的参数的脚本,那么可以接收到包含空格的参数,所以你得到的是用户提供的参数列表。

现在在你的Python代码中,你可以使用这个string列表作为你程序的input。 由于列表是由基于零的整数索引的,因此可以使用list [0]语法获取各个项目。 例如,要获取脚本名称:

 script_name = sys.argv[0] # this will always work. 

尽pipe知道这很有趣,但您很less需要知道您的脚本名称。 要获得脚本文件名后的第一个参数,可以执行以下操作:

 filename = sys.argv[1] 

这是一个非常常见的用法,但是请注意,如果没有提供参数,它将会失败并返回IndexError。

另外,Python允许你引用一个列表的一部分,所以为了获得用户提供的参数(但没有脚本名称)的另一个列表 ,你可以做

 user_args = sys.argv[1:] # get everything after the script name 

此外,Python允许您将一系列项目(包括列表)分配给variables名称。 所以,如果你期望用户总是提供两个参数,你可以将这些参数(string)分配给两个variables:

 user_args = sys.argv[1:] fun, games = user_args # len(user_args) had better be 2 

所以,在最后回答你的具体问题, sys.argv[1]代表提供给有问题的脚本的第一个命令行参数(作为一个string )。 它不会提示input,但如果在脚本名称后面的命令行上没有提供参数,则它将失败,并显示IndexError。

sys.argv [1]包含传递给脚本的第一个命令行 参数 。

例如,如果您的脚本命名为hello.py ,则发出:

  $ python3.1 hello.py foo 

要么:

 $ chmod +x hello.py # make script executable $ ./hello.py foo 

您的脚本将打印:

 你好,富 

sys.argv是一个列表。

这个列表是由你的命令行创build的,它是你的命令行参数列表。

例如:

在你的命令行中input这样的内容,

 python3.2 file.py something 

sys.argv将成为一个列表['file.py','something']

在这种情况下, sys.argv[1] = 'something'

只要增加Frederic的答案,例如,如果您调用您的脚本如下:

./myscript.py foo bar

sys.argv[0]将是“./myscript.py”sys.argv sys.argv[1]将是“foo”和sys.argv[2]将是“酒吧”…等等。

在您的示例代码中,如果您按如下所示调用脚本./myscript.py foo ,脚本的输出将为“Hello there foo”。

给Jason的答案增加几个点:

获取所有用户提供的参数: user_args = sys.argv[1:]

把sys.argv看作是一个string列表(由Jason提到)。 所以所有的列表操作将在这里适用。 这被称为“列表切片”。 欲了解更多信息请访问

语法如下:list [start:end:step]。 如果省略开始,则默认为0,如果省略,则默认为列表的长度。

假设你只想在第三个参数后面取所有的参数,那么:

 user_args = sys.argv[3:] 

假设你只想要前两个参数,那么:

 user_args = sys.argv[0:2] or user_args = sys.argv[:2] 

假设你想要参数2到4:

 user_args = sys.argv[2:4] 

假设你想要最后一个参数(最后一个参数总是-1,所以这里发生的是我们从后面开始计数,所以start是最后一个,没有结束,没有一个步骤):

 user_args = sys.argv[-1] 

假设你想要第二个参数:

 user_args = sys.argv[-2] 

假设你想要最后两个参数:

 user_args = sys.argv[-2:] 

假设你想要最后两个参数。 在这里,开始是-2,这是第二个最后一个项目,然后到最后(用“:”表示):

 user_args = sys.argv[-2:] 

假设你想要除了最后两个参数之外的所有东西。 这里,start是0(默认),end是最后一项:

 user_args = sys.argv[:-2] 

假设你想以相反的顺序参数:

 user_args = sys.argv[::-1] 

希望这可以帮助。

sys.argv是一个包含脚本path和命令行参数的列表; 即sys.argv [0]是您正在运行的脚本的path,所有后续成员都是参数。

在通过命令行运行脚本时将parameter passing给您的python脚本

python create_thumbnail.py test1.jpg test2.jpg

在这里,脚本名称 – create_thumbnail.py,参数1 – test1.jpg,参数2 – test2.jpg

在我使用的create_thumbnail.py脚本中

 sys.argv[1:] 

这给了我在命令行中传递的参数列表['test1.jpg','test2.jpg']

sys .argv将显示运行脚本时传递的命令行参数,或者你可以说sys.argv将存储从terminal运行的python传递的命令行参数。

试试这个:

 import sys print sys.argv 

argv存储在Python列表中传递的所有参数。 以上将打印通过运行脚本传递的所有参数。

现在尝试这样运行你的filename.py像这样:

 python filename.py example example1 

这将在列表中打印3个参数。

 sys.argv[0] #is the first argument passed, which is basically the filename. 

同样,argv 1是第一个参数,在这个例子中是“example”

有一个类似的问题已经在这里问btw。 希望这可以帮助!