我有一个完美正常的命令行脚本。现在我想让我的工具更直观。
我有:
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
?
答案 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 :(得分: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个字符)。
最后,由于这个论点是必需的,你甚至需要一个旗帜吗?只是让它成为一个位置论证。脚本将输入和/或输出文件名作为位置参数是很常见的。