Python - 需要在命令行上获取参数

时间:2013-07-16 10:27:59

标签: python loops arguments

所有

我有一个我想写的个人脚本,我遇到了一个小问题。问题是,无论参数在哪里,我都希望能够支持'-s'参数。我也希望不止一次允许这个论点。例如:

script.py firstargument secondargument -s thirdargument -s 4th fifth -s six

我尝试过的是不行。我尝试了以下内容:

currentArg = 1
foldername = sys.argv[1:]
for folders in foldername:
   if "-s" in folders:
   newArg = currentArg + 1
   setType = str(sys.argv[newArg])
   function(setType)

它正在做的是它将-s作为参数并仍然将其传递给函数。我在上面的内容是看到第一个'-s'位于第四个位置,加1到4,然后setType设置为sys.argv [5]。我也希望它继续遍历参数并找到任何'-s',然后使用下一个参数作为值。有什么想法吗?

我得到的错误是:

WindowsError: [Error 3] The system cannot find the path specified: 'c:\\-s/*.*'

请注意,它将-s视为参数并尝试将其作为文件夹传递,但我希望它将NEXT参数作为文件夹传递...

有更好的方法吗?我需要考虑所有“-s”...

5 个答案:

答案 0 :(得分:1)

argparse很漂亮。为它重新设计命令行界面或编写自己的CLI解析器。 CLI示例:

args = ['firstargument', 'secondargument', '-s', 'thirdargument', '-s', 'fourth', 'fifth', '-s', 'sixth']
last_arg = None
container = []
marker = '-s'
for arg in args:
    if (arg != marker): last_arg = arg
    else: container.append(last_arg) 
print container        

执行结果:

$python test.py
['secondargument', 'thirdargument', 'fifth']

答案 1 :(得分:0)

开始时的事情:

import sys
import getopt

def some_function(*args):
    print "Got", args
    return None

funct_dict = \
{
    "-s" : some_function,
    "--skip" : some_function
}
safety_dance = lambda *x: None

try:
    optlist, args = getopt.getopt(sys.argv[1:], "s:", ["--skip="])
except getopt.GetoptError:
    print "Das ist verboten"
    sys.exit()

for (key, option) in optlist:
    funct_dict.get(key, safety_dance)(option)

答案 2 :(得分:0)

我一直非常满意地使用http://docopt.org/

https://github.com/docopt/docopt

它完成了所有猴子为你工作,你只需要为它编写文档就可以获得命令行参数结构......

增加了好处:您的用户可以免费获得帮助: - )

对于您的具体情况,它会(强烈地:-))鼓励您使用您可能喜欢或可能不喜欢的某些标准惯例。例如,您可以选择位置和命名参数,docopt会将它们组合在一起,但命名参数通常具有以下形式:

--speed=20
-fmyfile.txt

答案 3 :(得分:0)

我的建议是使用专用库来解析参数,当它们比例如字符串列表更复杂时。 Docopt很棒,或者如果您不想安装第三方库,请转到argparse。

但是,如果您想自己动手,请尝试以下方法:

args = sys.argv[1:]
if '-s' in args:
    i = args.index('-s')
    opt_val = args.pop(i+1)
    args.remove('-s')
folders = []
for folder in args:
    folders.append(folder)

答案 4 :(得分:0)

见其他解决方案:

args = ['firstargument', 'secondargument', '-s', 'thirdargument', '-s', 'fourth', 'fifth', '-s', 'sixth', 'seventh']
args1 = ['firstargument', 'secondargument', '-s', 'thirdargument', '-s', 'fourth', 'fifth', '-s', 'sixth', 'seventh', '-s']

marker = "-s"
def parser(arglist):
    scraplist, result = [], []
    arglist_range = range(len(arglist))
    #Remember candidates for exclude. It's your marker and previous element.
    for arg in arglist_range:
        if arglist[arg] == marker:
            scraplist.append(arg - 1)
            scraplist.append(arg)
    #Excluding marked elements
    for arg in arglist_range:
        if (not arg in scraplist):
            result.append(arglist[arg])
    return result

print parser(args)
print parser(args1)

运行它:

$ python test.py 
['firstargument', 'fourth', 'sixth', 'seventh']
['firstargument', 'fourth', 'sixth']

Goog练习可以得到你想要的结果。例如: input = ['some','input','data'] output = ['some','correct','output']