繁体   English   中英

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

[英]Python - Need to get argument on command line

所有,

我有一个个人脚本正在尝试编写,但遇到了一个小问题。 问题是无论参数在哪里,我都希望能够支持“ -s”参数。 我也希望该论点不止一次被允许。 例如:

script.py firstargument secondargument -s thirdargument -s第四第五-s第六

我尝试过的没有用。 我尝试了以下方法:

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” ...

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']

开始于:

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)

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

https://github.com/docopt/docopt

它为您完成了所有的工作,您只需编写文档即可获得命令行参数结构...

额外的好处:您的用户免费获得帮助:-)

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

--speed=20
-fmyfile.txt

我第二次建议使用一个专用的库来解析参数,因为它们变得比字符串列表复杂得多。 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)

查看其他解决方案:

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']

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM