所有
我有一个我想写的个人脚本,我遇到了一个小问题。问题是,无论参数在哪里,我都希望能够支持'-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”...
答案 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']