Argparse Arg>旗

时间:2015-03-24 13:01:56

标签: python argparse flags

我有一个完美正常的命令行脚本。现在我想让我的工具更直观。

我有:

parser.add_argument("-s",help = "'*.sam','*.fasta','*.fastq'", required=True)

现在,python script.py -s savefile.sam有效,但我希望它是python script.py > savefile.sam

parser.add_argument("->",help = "'*.sam','*.fasta','*.fastq'", required=True)

无法正常工作:error: unrecognized arguments: -

我可以使用argparse执行此操作,还是应该选择-s

2 个答案:

答案 0 :(得分:3)

> savefile.sam是shell语法,意味着"将输出发送到文件savefile.sam"。 Argparse甚至不会看到命令的这一部分,因为shell会先解释它(假设你从一个合适的shell发出这个命令)。

虽然您的命令确实有意义,但您不应该尝试使用argparse来实现它。相反,如果未检测到-s,只需将脚本的输出发送到stdout即可。您可以通过设置-s的默认值来实现此目的:

parser.add_argument("-s",
                    type=argparse.FileType("w"),
                    help="'*.sam','*.fasta','*.fastq'",
                    default=sys.stdout)

这样,您就可以运行python script.py > savefile.sam,并且会发生以下情况:

  1. shell会评估python script.py
  2. argparse将看不到其他参数,并将使用默认的sys.stdout
  3. 您的脚本会将输出发送到stdout
  4. shell会将脚本的输出从stdout重定向到savefile.sam
  5. 当然,您也可以使用pipestdout脚本发送到stdin另一个流程。

    请注意,使用FileType,使用-s -指定stdout也是合法的。有关详细信息,请参阅here

答案 1 :(得分:0)

从某种意义上说,argparse有效

import argparse
import sys
print sys.argv
parser=argparse.ArgumentParser()
parser.add_argument('->')
print parser.parse_args('-> test'.split())
print parser.parse_args()

没有参数,它只是将None分配给>属性。请注意,您无法以args.>的形式访问此属性。您必须使用getattr(args,'>')(这是argparse内部使用的内容)。更好的是,将此参数指定为正确的长名称或目标。

1401:~/mypy$ python stack29233375.py
['stack29233375.py']
Namespace(>='test')
Namespace(>=None)

但是如果我给出一个-> test参数,那么shell重定向会消耗>,如下所示:

1405:~/mypy$ python stack29233375.py -> test
usage: stack29233375.py [-h] [-> >]
stack29233375.py: error: unrecognized arguments: -
1408:~/mypy$ cat test
['stack29233375.py', '-']
Namespace(>='test')

只有-argv中传递,然后传递给解析器。所以它抱怨无法识别的论点。可选的位置参数可能已使用此字符串,从而导致无错误。

请注意,我必须查看test文件才能看到输出的其余部分 - 因为shell会将stdout重定向到test。错误消息转到stderr,因此不会重定向。

您可以使用-参数从ArgumentParser(或除此之外)更改前缀字符。但你不能单独使用这样的角色。标志必须是prefix + char(即2个字符)。

最后,由于这个论点是必需的,你甚至需要一个旗帜吗?只是让它成为一个位置论证。脚本将输入和/或输出文件名作为位置参数是很常见的。