sys.argv [1]在脚本中的含义


146

我目前正在自学Python,只是想以简化的方式(参考下面的示例)想知道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()

2
这不是问题的一部分,它已经很老了,但模块argparse,很可能是你正在尝试做的更好,根据
的LLR

Answers:


333

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

对于Python的每次调用,sys.argv都会自动生成一个字符串列表,这些字符串代表命令行上的参数(用空格分隔)。该名称来自C编程约定,其中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代码中,您可以使用此字符串列表作为程序的输入。由于列表由从零开始的整数索引,因此您可以使用list [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。


1
当您显示字符串列表时sys.argv,我想知道该行的from __future__ import print_function作用。如果我不是在Python 3上运行而是在Python 2上运行,是否必须添加一些内容?@Jason R. Coombs
Nicholas

1
@NicholasLiu,如果您使用的是Python 3,则无需添加它。出于完整性考虑,我添加了它。尝试在Python 2上不使用它运行,您将得到与我所描述的结果不同的结果。试试看。
詹森·库姆斯

@ JasonR.Coombs我对此感到困惑:sys.argv **is** automatically a list of strings。你是说“给”还是“回”?
JinSnow

1
@Guillaume:这是一个细微的语义差异,但是在Python中,诸如sys.argv之类的名称持有对对象的引用。因此,从技术上讲,模块的argv属性是对sys包含参数字符串的列表对象的引用。使用givesreturns建议使用函数调用或生成器或其他构造。references或者represents可能是更精确的用语,但is已经足够接近了。
Jason R. Coombs

@ JasonR.Coombs如果我main通过导入模块直接调用(假设模块名称为moduleA.py)并像那样调用该函数会发生什么import moduleA; moduleA.main()。在那种情况下,没有命令行参数..因此sys.argv[0]仍然应该代表filenameie。应该打印出来moduleA.py吗?
alpha_989 '18

34

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

例如,如果您的脚本已命名hello.py并且发出:

$ python3.1 hello.py foo

要么:

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

您的脚本将打印:

你好,富

我必须运行以下命令:exec py C:\\ project-open \\ servers \\ projop \\ packages \\ intranet-timesheet2 \\ www \\ hours \\ y.py是否有使用相对路径的方法python文件?
yaksh

25

sys.argv 是一个列表。

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

例如:

在命令行中,您需要输入以下内容,

python3.2 file.py something

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

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


12

仅添加Frederic的答案,例如,如果您按以下方式调用脚本:

./myscript.py foo bar

sys.argv[0]将是“ ./myscript.py” sys.argv[1]将是“ foo”并且 sys.argv[2]将是“ bar” ...依此类推。

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


9

在Jason的答案中添加更多点:

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

将sys.argv视为字符串列表(如Jason所述)。因此,所有列表操作都将在此处应用。这称为“列表切片”。有关更多信息,请访问此处

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

假设您只想在第3个参数之后采用所有参数,则:

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,所以这里发生的事情是我们从后面开始计数。所以开始是last,no end,no step):

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]

希望这可以帮助。


4

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


3

通过命令行运行脚本时将参数传递给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']传递的参数列表


1

sys.argvsys模块的属性。它说参数是在命令行中传递到文件中的。sys.argv[0]捕获文件所在的目录。sys.argv[1]返回在命令行中传递的第一个参数。就像我们有一个example.py文件。

example.py

import sys # Importing the main sys module to catch the arguments
print(sys.argv[1]) # Printing the first argument

现在,当我们执行此操作时,在命令提示符下显示以下内容:

python example.py

它将在第2行引发索引错误。原因是尚未传递任何参数。您可以使用看到用户传递的参数的长度if len(sys.argv) >= 1: # Code。如果我们通过传递参数来运行example.py

python example.py args

它打印:

args

因为这是第一个争论!假设我们已经使用PyInstaller使其成为可执行文件。我们可以这样做:

example argumentpassed

它打印:

argumentpassed

在终端中执行命令时,这确实很有帮助。首先检查参数的长度。如果未传递任何参数,请执行帮助文本。


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是传递的第一个参数,在这种情况下为“ example”

顺便说一句,这里已经提出了类似的问题。希望这可以帮助!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.