我正在寻找一种使用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
这可能吗?如果是这样,怎么样?
答案 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