Python argparse:多个可选位置参数之间的依赖关系
我正在寻找一种使用python3中的argparse模块解析以下命令行语法的方法:Python argparse:多个可选位置参数之间的依赖关系,python,python-3.x,command-line-arguments,argparse,Python,Python 3.x,Command Line Arguments,Argparse,我正在寻找一种使用python3中的argparse模块解析以下命令行语法的方法: myapp.py [folder] [[from] to] 含义:用户可以选择定义一个文件夹,默认为cwd。此外,用户最多可以传递两个整数。如果只给出一个数字,则应将其存储在to变量中。这类似于python内置的range()的语法 e、 g: 可能吗?如果是,如何使用?使用选项;这就是他们的目的(而且argparse擅长解析) 因此,语法如下 myapp.py [-F folder] [[from] to]
myapp.py [folder] [[from] to]
含义:用户可以选择定义一个文件夹,默认为cwd。此外,用户最多可以传递两个整数。如果只给出一个数字,则应将其存储在to
变量中。这类似于python内置的range()
的语法
e、 g:
可能吗?如果是,如何使用?使用选项;这就是他们的目的(而且
argparse
擅长解析)
因此,语法如下
myapp.py [-F folder] [[from] to]
将更有意义,并且更容易解析。使用选项;这就是他们的目的(而且
argparse
擅长解析)
因此,语法如下
myapp.py [-F folder] [[from] to]
将更有意义,并且更容易解析。您可以做一些非常愚蠢的事情:
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 自己——你真的应该考虑在这里使用实际选项…
你可以做一些相当愚蠢的事情: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 自己——你真的应该考虑在这里使用实际选项…
< P>我也建议你自己分析语法。FWIW,我甚至在argparse或类似的项目上解析sys.argv,因为自己解析sys.argv可以很好地与pylint或flake8配合使用。我还建议自己解析sys.argv
FWIW,即使在argparse或类似的项目上,我也会解析sys.argv,因为解析sys.argv本身可以很好地处理pylint或flake8。如果不使用文件夹的命名参数,我看不到一种方法:
# 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
如果不使用文件夹的命名参数,我无法找到执行此操作的方法:
# 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
argparse应该如何区分
myapp文件夹
和myapp 10
?在我看来,除了对返回的名称空间进行后期处理之外,您别无选择——此时,您最好只处理sys.argv
argparse应该如何区分myapp folder
和myapp 10
?在我看来,除了对返回的名称空间进行后期处理之外,您别无选择——在这一点上,您最好只处理sys.argv
,这将是[to][from]
,而不是[[from]to]
@FabianHenze。我认为这是获得所需位置行为的唯一方法。如果颠倒顺序,则会将单个整数指定给“from”而不是“to”。唯一的另一个选项(对于argparse
)是使用所有命名参数,例如myapp.py--folder--from--to
,它将是[to][from]
,而不是[from]to]
@FabianHenze。我认为这是获得所需位置行为的唯一方法。如果颠倒顺序,则会将单个整数指定给“from”而不是“to”。唯一的其他选项(对于argparse
无论如何)是使用所有命名参数,例如myapp.py--folder--from--to
holy sh**。。。真棒的答案,但我会按照你的sys.argv
advicesh**。。。回答得真棒,但我会听从你的sys.argv
建议