2013-07-19 30 views
0

我一直在大量使用“Really Cheap Command-Line Option Parsing in Ruby”中的答案。这是伟大的,为我的目的,总是我需要的。如何在Python中真正廉价的命令行解析?

现在我发现自己回到了Python领域,因为内部库支持我想要做的事情。我正在考虑将其移植到Ruby,但这超出了这个问题的范围,但我想使用类似的东西。

这里是很便宜的方法,我在Ruby中经常使用:

$quiet  = ARGV.delete('-d') 
$interactive = ARGV.delete('-i') 

如果在ARGV阵列中的"-d",则$quiet设置为"-d",而不是零。如果没有"-d",则$quiet变成nil

有没有类似的东西我可以在Python中做?

+2

你检查了argparse吗? –

+0

我对argparse很熟悉,但比我在IIRC上面发布的要重得多。 – Ramy

回答

6

您可能需要使用sys.argv

from sys import argv 
quiet = '-d' in argv # True if '-d' in argv else False 

如果你想从argv删除'-d',改变第二行这样的:

quiet = '-d' in argv and (argv.remove('-d') or True) 

如果这降低了它的便宜性,让我们来制作它的功能:

getArg = lambda x: x in argv and (argv.remove(x) or True) 
quiet = getArg('-d') 
interactive = getArg('-i') 
+0

真的很便宜,绝对符合要求 – Stephan

+0

。什么是想要的。 – Jiminion

+1

如果找到它,不会从args中删除该选项,这会使剩下的部分(作为文件名等)。) 更难。 – kindall

1

试试这个:

import sys 

quiet = 1 if "-d" in sys.argv else None 
+0

这可以准确地工作,但mbcoder的响应更彻底,并提供了我期待的更短的语法。 – Ramy

1
import argparse 
parser = argparse.ArgumentParser() 
parser.add_argument("-d", action='store_true') 

args = parser.parse_args() 

if (args.d): 
    Print "D switch is on!" 
+0

你不需要先创建一个新的argparser对象吗?类似于'parser = argparse.ArgumentParser(description ='处理一些整数。')'from http://docs.python.org/dev/library/argparse.html – Ramy

+0

是的。像jh314 sez。 – Jiminion

0

恕我直言,最轻的方式(如果你不希望使用​​)将是一个辅助功能:

import sys 

def flag(arg): 
    try: 
     index = sys.argv.index(arg) 
    except ValueError: 
     return None 
    else: 
     return sys.argv.pop(index) 

用法:

quiet, interactive = flag("-d"), flag("-i") 

当然,因为这些只是标志,你可以返回TrueFalse而不是None和arg,但我试图保持它与Ruby功能类似于posisble。