argparse:多个可选位置参数之间的依赖关系

时间:2012-10-18 18:37:32

标签: python python-3.x command-line-arguments argparse

我正在寻找一种使用python3中的argparse模块解析以下命令行语法的方法:

myapp.py [folder] [[from] to]

含义:用户可以选择定义一个默认为cwd的文件夹。此外,用户可以传递最多两个整数。如果只给出一个数字,则应将其存储在to变量中。这类似于python builtin range()的语法。

e.g:

myapp.py folder
myapp.py 10
myapp.py 5 10
myapp.py folder 5 10
myapp.py folder 10

这可能吗?如果是这样,怎么样?

4 个答案:

答案 0 :(得分:1)

使用选项;那是他们的目标(以及argparse擅长解析)。

因此,语法如

myapp.py [-F folder] [[from] to]

会更有意义,并且更容易解析。

答案 1 :(得分:1)

你可以做一些非常愚蠢的事情:

import argparse
import os

class MyAction(argparse.Action):
    def __call__(self,parser,namespace,values,option_string=None):
        namespace.numbers = []
        namespace.path = os.getcwd()
        for v in values:
            if os.path.isdir(v):
                namespace.path = v
            else:
                try:
                    namespace.numbers.append(int(v))
                    if len(namespace.numbers) > 2
                       parser.error("Barg2!!!")
                except ValueError:
                    parser.error("Barg!!!")

p = argparse.ArgumentParser()
p.add_argument('stuff',nargs='*',action=MyAction)
n = p.parse_args()
print n

但是如果你要这样做,你也可以自己处理sys.argv - 你应该考虑在这里使用实际选项......

答案 2 :(得分:0)

我还建议你自己解析sys.argv。

FWIW,我甚至在argparse或类似工作的项目上解析sys.argv,因为解析sys.argv自己可以很好地使用pylint或flake8。

答案 3 :(得分:0)

如果不使用文件夹的命名参数,我无法找到方法:

# usage: argparsetest2.py [-h] [--folder [FOLDER]] [to] [fr]

import argparse
import os

parser = argparse.ArgumentParser()
parser.add_argument('--folder', dest='folder', nargs='?', default=os.getcwd())
parser.add_argument('to', type=int, nargs='?')
parser.add_argument('fr', type=int, nargs='?')
args = parser.parse_args()

print args