11

argv

到底是什么东西!?

编辑:如果可以的话,请你写一两行并解释它是如何工作的?

4

7 回答 7

27

试试这个简单的程序,把它命名为program.py

import sys
print sys.argv

并尝试执行

python program.py
python program.py a b c
python program.py hello world

注意什么是 argv 现在。

于 2012-11-07T06:02:11.910 回答
18

它表示参数向量,它包含传递给程序的参数。第一个始终是程序名称。

例如,如果你像这样执行你的 Python 程序......

 $ python your_script.py --yes

...那么您的sys.argv遗嘱将包含your_script.pyand --yes

于 2012-11-07T05:58:46.777 回答
13

在你浪费时间“开始学习一些更高级别的代码”之前,你需要学习如何找到这样的信息。知道如何查找一个不熟悉的函数/类/变量,而不必等待 30-60 分钟让 SO 上的人回答您(并且显然在此过程中获得多个反对票),将比添加一个更有用您的曲目中的一条信息。

从内置帮助:

>>> import sys
>>> help(sys)
…
argv -- command line arguments; argv[0] is the script pathname if known
…

这适用于任何模块。通常,模块中的各个类和函数具有更详细的信息(但这不适用于 argv,因为它只是一个list,并且列表没有自定义帮助)。

如果这还不够信息,文档(或2.x 文档)会说:

系统。argv

传递给 Python 脚本的命令行参数列表。argv[0] 是脚本名称(它是否为完整路径名取决于操作系统)。如果命令是使用解释器的 -c 命令行选项执行的,则 argv[0] 设置为字符串“-c”。如果没有将脚本名称传递给 Python 解释器,则 argv[0] 是空字符串。

要遍历标准输入或命令行上给出的文件列表,请参阅 fileinput 模块。

谷歌搜索“python argv”的第一个网络结果是Python 作者 Guido 的一篇博客文章,对你来说可能有点太高级了,但第二个是关于“命令行参数”的教程。

正如大多数这些事情告诉您的那样,许多简单的脚本通常可以直接使用fileinput而不是argv直接处理,而更复杂的脚本通常需要使用argparse(或optparse,getopt或其他替代方案,如果您需要使用 Python 2.6 或更早版本)。

一个sys.argv恰到好处的例子是这个将相对路径名转换为绝对路径名的简单程序(对于那些不在 linux 或其他带有 abspath、GNU readlink 或内置类似工具的平台上的人):

import os, sys
print('\n'.join(os.path.abspath(arg) for arg in sys.argv[1:]))

或者这个只添加一堆数字的“添加”工具(对于那些卡在 cmd.exe 或其他没有内置算术的有缺陷的 shell 的人):

import sys
print(sum(int(arg) for arg in sys.argv[1:]))
于 2012-11-07T06:51:14.073 回答
5

您可以使用或不使用参数运行 python 程序。如果您使用参数,它们在 argv 向量内。例如

蟒蛇程序!!!

#!/usr/bin/python

import sys

print 'Number of arguments:', len(sys.argv), 'arguments.'
print 'Argument List:', str(sys.argv)

像这样运行脚本

$ python test.py arg1 arg2 arg3

结果是

Number of arguments: 4 arguments.
Argument List: ['test.py', 'arg1', 'arg2', 'arg3']

示例来自 教程点

于 2012-11-07T06:02:35.583 回答
2

如果您有一个可执行的 python 脚本并使用如下参数调用它:

myscript.py -a -b --input myfile --another_argument

然后sys.argv是一个列表,其中包含:

['myscript.py', '-a', '-b', '--input', 'myfile', '--another_argument']

使用它是访问这些参数的唯一方法,这也是它的主要用途。但是,大多数应用程序使用argparse模块等库来访问此信息,而无需sys.argv直接使用。

于 2012-11-07T06:04:31.113 回答
2

sys .argv 将显示运行脚本时传递的命令行参数,或者您可以说 sys.argv 将存储从终端运行时在 python 中传递的命令行参数

它将参数存储在列表 ds 中。

示例用法: 创建一个文件说:cmdlineargs.py 并将以下内容放入其中:

import sys
print sys.argv 

现在在您的终端/cli 中运行该文件:

python cmdlineargs.py 

或类似的东西

python cmdlineargs.py example example1

注意现在发生的事情。当您运行该脚本时,您的脚本将打印在您的 cmd 行参数中传递的所有内容。

重要的是要知道:

print len(sys.argv) #total arguments passed
sys.argv[0] #this is your script name stored in sys.argv.
print sys.argv #display all arguments passed
sys.argv[0] #is the first argument passed, which is basically the filename.
sys.argv #stores all cmd line args in a list ds

您可以查找像这样传递的每个特定参数,可能是:

cmdLineArg = len(sys.argv)
i=0
for argv in sys.argv:
    if cmdLineArg<=len(sys.argv) :
        print "argument",i,"is", str(sys.argv[i])
        i=i+1
    else:
        print "Only script name in sys.argv"

样本结果:

假设您在终端中运行以下命令。

python cmdlineargs.py example example1

您的结果应类似于:

argument 0 is cmdlineargs.py
argument 1 is example
argument 2 is example1  

注意参数 0 与文件名相同 。希望这会有所帮助。


感谢您的支持,改进了我对循环的回答。更多pythonian的答案应该是这样的:

i=0
for argv in sys.argv:
    if cmdLineArg==1:
        print "Only script name in sys.argv"
    elif (cmdLineArg>1 and cmdLineArg<=len(sys.argv)):
        print "argument ",i,"is", str(argv)
        i=i+1
print "total arguments passed:\t", totalargs

我也是 python 新手,所以我习惯于声明 i 和 j 来遍历数组。:)

于 2016-09-07T00:25:51.103 回答
1

脚本 printArgv.py:

import sys
print sys.argv.__class__
spam = sys.argv[1:]
print spam

运行它: python printArgv.py 1 2 3 4 5

你会发现输出:

<type 'list'>
['1', '2', '3', '4', '5']

这意味着 sys.argv 是您在脚本名称之后输入的参数列表。

于 2016-12-16T05:30:24.933 回答