2013-04-06 23 views
1

我有一个python脚本,我想从终端运行,它需要大约10个数值参数。到目前为止,我能想到的传递参数给程序的唯一方法如下:从命令行将参数传递给python程序,比sys.argv更好吗?

python myscript.py 10,20,30,,40 

,然后使用sys.argv中挑开的参数,工艺和使用它们。事情是,有时中间的一些参数需要是空白的,以便程序使用它的“默认值”。这意味着目前我需要在参数中使用逗号来指定一个值为空白,这与其他程序中看到的标准相反。

有没有更好的方法去做这件事?

干杯,

弥敦道

操作系统:Ubuntu的

Python版本:2.7

+0

http://docs.python.org/2/library/argparse.html – jamylak 2013-04-06 10:41:51

+1

考虑看看那个现在,欢呼声 – 2013-04-06 10:46:34

+2

也许将您的参数存储在一个文件中,然后从您的程序中读取它是一个解决方案。 – zhangyangyu 2013-04-06 10:47:39

回答

3

首先,如果你有一些参数可以被省略,这些参数应该选项,而不是真正的论据。

Python提供了多种解析参数的方法。最好的选择是argparse,它具有大量的功能和其开发继续的模块。如果你必须支持python的“旧”版本,那么你可能会对optparse感兴趣,尽管它已经在python3.2中被弃用了。存在也是一个getopt模块,它模仿C'S getopt的(!做使用这种它的存在,更由于历史的原因,并帮助这些老样式解析的使用人)

使用​​一个简单的例子可能是:

import argparse 

parser = argparse.ArgumentParser() 
parser.add_argument('--option-name', action='store', dest='option_name_var') 
parser.add_argument('numbers', type=int, nargs='*') 

parsed = parser.parse_args() #parses sys.argv by default 
print(parsed.numbers) 
print(parsed.option_name_var) 

哪些可以作为:

$python example.py 1 2 3 
[1, 2, 3] 
None 
$python example.py 1 2 3 --option-name "value" 
[1, 2, 3] 
value 
$python example.py 1 2 3 --option-name 
usage: example.py [-h] [--option-name OPTION_NAME_VAR] [numbers [numbers ...]] 
example.py: error: argument --option-name: expected one argument 
$python example.py --option-name 
usage: example.py [-h] [--option-name OPTION_NAME_VAR] [numbers [numbers ...]] 
example.py: error: argument --option-name: expected one argument 
$python example.py --option-name 5 
[] 
5 
$python example.py 1 2 "string" 
usage: example.py [-h] [--option-name OPTION_NAME_VAR] [numbers [numbers ...]] 
example.py: error: argument numbers: invalid int value: 'string' 

注意如何号码会自动转换为整数的列表,并发出一个错误,如果该值不是N个整或有遗漏的参数等

你也有一个默认的说明文字:

$python example.py -h 
usage: example.py [-h] [--option-name OPTION_NAME_VAR] [numbers [numbers ...]] 

positional arguments: 
    numbers 

optional arguments: 
    -h, --help   show this help message and exit 
    --option-name OPTION_NAME_VAR 
相关问题