0

全部,

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

script.py 第一个参数第二个参数-s 第三个参数-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”...

4

5 回答 5

1

argparse很漂亮。为它重新设计你的命令行界面或编写你自己的 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']
于 2013-07-16T10:40:12.953 回答
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)
于 2013-07-16T10:46:02.450 回答
0

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

https://github.com/docopt/docopt

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

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

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

--speed=20
-fmyfile.txt
于 2013-07-16T10:46:59.247 回答
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)
于 2013-07-16T11:15:42.383 回答
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 实践提供您想要的结果。例如:输入 = ['some', 'input', 'data'] 输出 = ['some', 'correct', 'output']

于 2013-07-17T06:24:55.557 回答