2

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

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

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

例如:

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

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

4

4 回答 4

1

使用选项;这就是他们的目的(并且argparse擅长解析)。

因此,像这样的语法

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

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

于 2012-10-18T18:53:12.987 回答
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自己处理——你真的应该考虑在这里使用实际选项......

于 2012-10-18T19:00:42.390 回答
0

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

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

于 2012-10-18T19:05:41.930 回答
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
于 2012-10-18T19:15:45.453 回答