[英]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.