2010-11-07 112 views
74

我目前在教自己的Python,只是想知道(在参考我的例子下)以简单的术语sys.argv [1]代表什么。它只是要求输入吗?sys.argv [1]在脚本中的含义

#!/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() 
+0

这是不是问题的一部分,它是非常古老的,但模块[argparse](https://docs.python.org/2/library/argparse.html#module-argparse),可能是更好的根据[this](http://stackoverflow.com/q/1009860/2886003) – Llopis 2014-04-04 13:14:13

回答

212

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

对于Python的每次调用,sys.argv都会自动在命令行上显示表示参数(用空格分隔)的字符串列表。该名称来自C programming convention,其中argv和argc表示命令行参数。

当您熟悉Python时,您将需要了解更多关于列表和字符串的知识,但是与此同时,这里有几件事要知道。

您可以简单地创建一个脚本,用于在参数表示时打印参数。它还打印参数的数量,使用列表中的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代码中,你可以使用这个字符串列表作为你程序的输入。由于列表是由基于零的整数索引的,因此可以使用列表[0]语法获取单个项目。例如,获取脚本名称:

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

尽管知道这很有趣,但您很少需要知道您的脚本名称。要获得脚本文件名后的第一个参数,你可以做到以下几点:

filename = sys.argv[1] 

这是一个很常见的用法,但要注意,如果提供任何参数也将失败,并IndexError。

此外,利用Python可以参考一个列表的片段,因此要获得的只是用户提供的参数另一个列表(但没有脚本的名称),你可以做

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

此外, Python允许您将一系列项目(包括列表)分配给变量名称。所以,如果你希望用户始终提供两个参数,你可以指定这些参数(如字符串)两个变量:

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

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

+0

当你显示字符串'sys.argv'的列表时,我想知道'__future__导入print_function'。是否我必须添加,如果我是**不**运行在Python 3但Python 2? @Jason R. Coombs – Nicholas 2016-06-28 08:42:55

+1

@NicholasLiu,如果你使用Python 3,你不需要添加它。为了完整性,我添加了它。尝试在Python 2上运行,而且你会得到不同于我所描述的结果。试一试。 – 2016-07-10 01:02:59

+0

@ JasonR.Coombs我对这个问题感到困惑:'sys.argv **自动成为**字符串列表。你的意思是“给”或“回归”? – JinSnow 2017-02-20 20:51:51

26

sys.argv[1]包含第一command lineargument传递给脚本。

例如,如果你的脚本名为hello.py并发出:

$ python3.1 hello.py foo

或:

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

你的脚本将打印:

Hello there foo
3

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

10

,如果你打电话给你的脚本如下只是增加弗雷德里克的答案,例如:

./myscript.py foo bar

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

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

13

sys.argv是一个表。

此列表由您的命令行创建,它是您的命令行参数列表。

例如:

在命令行中输入你这样的事情,

python3.2 file.py something 

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

在这案例sys.argv[1] = 'something'

6

给杰森的答案增加几个分数:

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

将sys.argv看作字符串列表(由Jason提及)。所以所有的列表操作都适用于此。这被称为“列表切片”。欲了解更多信息,请访问here

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

假设你只想把所有的参数第三个参数后,则:

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,所以这里发生的是我们从后面开始计数。因此,开始是最后的,没有尽头,没有一步)

user_args = sys.argv[-1] 

假设你想要的倒数第二个参数:

user_args = sys.argv[-2] 

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

user_args = sys.argv[-2:] 

假设你想要最后两个参数。在这里,开始为-2,即倒数第二个项目,然后到结束(记为“:”):

user_args = sys.argv[-2:] 

假设你想,除了最后两个参数的一切。在这里,开始为0(默认设置),以及到底是倒数第二个项目:

user_args = sys.argv[:-2] 

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

user_args = sys.argv[::-1] 

希望这有助于。

2

要将参数传递到您的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']

0

的参数列表sys .argv将显示运行脚本时传递的命令行参数,或者您可以说sys.argv将存储从终端运行时在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是第一个参数传递,在这种情况下, '示例'

类似的问题已经被问here BTW。希望这可以帮助!