如何访问命令行参数?

641

我使用Python创建项目设置,但需要帮助获取命令行参数。

我在终端上尝试了以下命令:

$python myfile.py var1 var2 var3
在我的Python文件中,我想使用所有的输入变量。

1
这个回答解决了你的问题吗?如何读取/处理命令行参数? - Carl Walsh
11个回答

835

Python教程中有解释:

import sys

print(sys.argv)

更具体地说,如果你运行 python example.py one two three

>>> import sys
>>> print(sys.argv)
['example.py', 'one', 'two', 'three']

249

我强烈推荐使用 Python 2.7 及以后版本内置的 argparse 模块。

argparse 模块可减少样板代码,使您的代码更加健壮,因为该模块处理了所有标准用例(包括子命令),为您生成帮助和用法,检查并清洗用户输入 - 这些都是在使用sys.argv方法时必须考虑的事项。而且它是免费的(内置的)。

这里有一个小例子:

import argparse

parser = argparse.ArgumentParser("simple_example")
parser.add_argument("counter", help="An integer will be increased by 1 and printed.", type=int)
args = parser.parse_args()
print(args.counter + 1)

以及对于python prog.py -h的输出结果

usage: simple_example [-h] counter
    
positional arguments:
  counter     counter will be increased by 1 and printed.
    
optional arguments:
  -h, --help  show this help message and exit

对于 python prog.py 1 的输出结果如预期:

2

29
优质答案,我不太确定为什么这里的任何人会使用其他给出的方法。特别是它已经内置了!难道你们没有更好的事情要做吗?不需要解释,只进行翻译。 - Bassinator
6
提一下如何访问args命名空间中的特定参数:args.counter。 - MikeL
5
在不需要解析参数的情况下。 - reducing activity
5
如果在命令行中没有指定特定值,可以使用默认值,例如: parser.add_argument('var3', nargs='?', type=int, default=3) var3是一个可选参数,如果您在命令行中没有指定值,则可以在代码中访问var3,默认值为3。 - Albicocco
2
你就是老板!谢谢,伙计! - Josep Escobar
显示剩余5条评论

233

获取命令行参数

(不包括Python文件的名称)

import sys

sys.argv[1:]

[1:] 是一个 slice ,从第二个元素(索引为 1)开始,一直到参数列表的末尾。这是因为第一个元素是 Python 文件的名称,我们想要删除它。


12
[1:] 的意思是从列表、字符串或其他序列中的第二个元素开始获取到最后一个元素,不包括第一个元素。 - Kellen Stuart
14
@KolobCanyon 的意思是“从索引1开始获取子列表直到末尾”,即跳过第一个元素。 - Kamil Jarosz
3
@KolobCanyon在使用sys.argv时,需要将第二个参数[1:]向上移动一位,因为sys.argv的第一个参数默认是你正在运行的Python文件的名称,例如testrun.py。请注意,这并不改变原始含义。 - Samuel Nde
我们真的需要导入sys的所有内容吗? - einpoklum
@einpoklum 我很乐意接受建议,因为我最近不怎么写Python代码,但是我的雇主的Python风格指南确实建议以这种方式使用导入。 - Ryan M
好的,所以我查了一下,结果发现“importing sys”几乎没有什么成本。这主要是关于要搜索的标识符集合,而不是加载库。 - einpoklum

95

Python 代码:

import sys

# main
param_1= sys.argv[1] 
param_2= sys.argv[2] 
param_3= sys.argv[3]  
print 'Params=', param_1, param_2, param_3

调用:

$python myfile.py var1 var2 var3

输出:

Params= var1 var2 var3 

30

你可以使用sys.argv将参数作为列表获取。

如果您需要访问单个元素,可以使用

sys.argv[i]  

其中i是索引,0将给出正在执行的Python文件名。此后的任何索引都是传递的参数。


19

您可以使用“argparse”按键访问参数。

假设我们有这个命令:

python main.py --product_id 1001028

要访问参数product_id,我们首先需要声明它,然后获取它:

import argparse


parser = argparse.ArgumentParser()
parser.add_argument('--product_id', dest='product_id', type=str, help='Add product_id')
args = parser.parse_args()

print (args.product_id)

输出:

1001028

8
如果您这样调用它:$ python myfile.py var1 var2 var3
import sys

var1 = sys.argv[1]
var2 = sys.argv[2]
var3 = sys.argv[3]

与数组类似,您还有sys.argv[0],它始终是当前工作目录。

9
sys.argv[0] 不是当前工作目录,而是正在执行的文件的名称。 - look

6

我可以想到一些额外的东西。

正如 @allsyed 所说,sys.argv 给出了一个组件列表(包括程序名称),因此,如果您想知道通过命令行传递的元素数,可以使用 len() 来确定它。基于此,您可以设计异常/错误消息,如果用户没有传递特定数量的参数。

另外,如果您正在寻找更好的处理命令行参数的方法,我建议您查看 https://docs.python.org/2/howto/argparse.html


6
首先,你需要导入sys模块。

sys - 系统特定的参数和函数。

该模块提供了对解释器使用和维护的某些变量以及与解释器强烈交互的函数的访问。该模块仍然可用。如果该模块不再有效,我将编辑此帖子。

然后,您可以在此处打印参数的数量或您想要的任何内容,包括参数列表。

请按照以下脚本:

#!/usr/bin/python

import sys

print 'Number of arguments entered :' len(sys.argv)

print 'Your argument list :' str(sys.argv)

然后,运行您的Python脚本:

$ python arguments_List.py chocolate milk hot_Chocolate

您将会得到您所询问的结果:

Number of arguments entered : 4
Your argument list : ['arguments_List.py', 'chocolate', 'milk', 'hot_Chocolate']

希望这对某些人有所帮助。

1
使用以下代码,您可以检查参数是否已输入。如果是这样,将打印出参数;否则,将打印一条消息说明参数未输入。
import sys

if len(sys.argv) <= 1:
   print("No arguments were given")
else:
   for arg in sys.argv:
      print(arg)

4
这是错误的 AttributeError: 模块'sys'没有属性'args' - Breno Leitão
1
@BrenoLeitão 实际上是 sys.argv - smunteanu
@smunteanu 谢谢,我已经修复了代码。 - Rolf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接