如何将 python argparse 与 sys.argv 以外的参数一起使用?
How to use python argparse with args other than sys.argv?
我已经翻遍了文档,但似乎没有办法,但是:
有没有办法将 argparse 与任何字符串列表一起使用,而不是仅与 sys.argv 一起使用?
这是我的问题:我有一个看起来像这样的程序:
# This file is program1.py
import argparse
def main(argv):
parser = argparse.ArgumentParser()
# Do some argument parsing
if __name__ == '__main__':
main(sys.argv)
当直接从命令行调用此程序时,它工作正常。但是,我有另一个 python 脚本,它使用不同的命令行参数运行该脚本的批处理版本,我使用的是这样的:
import program1
arguments = ['arg1', 'arg2', 'arg3']
program1.main(arguments)
我仍然希望能够解析参数,但 argparse 自动默认使用 sys.argv 而不是我给它的参数。有没有办法传递参数列表而不是使用 sys.argv?
只需将脚本更改为默认 sys.argv[1:]
并解析省略第一个参数(即调用命令的名称)的参数
import argparse,sys
def main(argv=sys.argv[1:]):
parser = argparse.ArgumentParser()
parser.add_argument("--level", type=int)
args = parser.parse_args(argv)
if __name__ == '__main__':
main()
或者,如果您不能省略第一个参数:
import argparse,sys
def main(args=None):
# if None passed, uses sys.argv[1:], else use custom args
parser = argparse.ArgumentParser()
parser.add_argument("--level", type=int)
args = parser.parse_args(args)
# Do some argument parsing
if __name__ == '__main__':
main()
最后一个:如果你不能改变被调用的程序,你仍然可以做一些事情
假设您无法更改的程序名为 argtest.py
(我添加了打印参数的调用)
然后只需更改 argtest.sys
模块的本地 argv
值:
import argtest
argtest.sys.argv=["dummy","foo","bar"]
argtest.main()
输出:
['dummy', 'foo', 'bar']
您可以将字符串列表传递给 parse_args
:
parser.parse_args(['--foo', 'FOO'])
Python argparse 现在有一个参数 nargs
for add_argument
(https://docs.python/3/library/argparse.html).
它允许我们为命名参数设置任意数量的参数(这里,alist
)
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--alist", nargs="*")
args = parser.parse_args()
print(args.alist)
--alist
之后的所有命令行值都添加到列表中。
示例:
$ python3 argparse-01.py --alist fred barney pebbles "bamm bamm"
['fred', 'barney', 'pebbles', 'bamm bamm']
如您所见,可以引用参数,但没有必要,除非您需要保护 space.
我已经翻遍了文档,但似乎没有办法,但是:
有没有办法将 argparse 与任何字符串列表一起使用,而不是仅与 sys.argv 一起使用?
这是我的问题:我有一个看起来像这样的程序:
# This file is program1.py
import argparse
def main(argv):
parser = argparse.ArgumentParser()
# Do some argument parsing
if __name__ == '__main__':
main(sys.argv)
当直接从命令行调用此程序时,它工作正常。但是,我有另一个 python 脚本,它使用不同的命令行参数运行该脚本的批处理版本,我使用的是这样的:
import program1
arguments = ['arg1', 'arg2', 'arg3']
program1.main(arguments)
我仍然希望能够解析参数,但 argparse 自动默认使用 sys.argv 而不是我给它的参数。有没有办法传递参数列表而不是使用 sys.argv?
只需将脚本更改为默认 sys.argv[1:]
并解析省略第一个参数(即调用命令的名称)的参数
import argparse,sys
def main(argv=sys.argv[1:]):
parser = argparse.ArgumentParser()
parser.add_argument("--level", type=int)
args = parser.parse_args(argv)
if __name__ == '__main__':
main()
或者,如果您不能省略第一个参数:
import argparse,sys
def main(args=None):
# if None passed, uses sys.argv[1:], else use custom args
parser = argparse.ArgumentParser()
parser.add_argument("--level", type=int)
args = parser.parse_args(args)
# Do some argument parsing
if __name__ == '__main__':
main()
最后一个:如果你不能改变被调用的程序,你仍然可以做一些事情
假设您无法更改的程序名为 argtest.py
(我添加了打印参数的调用)
然后只需更改 argtest.sys
模块的本地 argv
值:
import argtest
argtest.sys.argv=["dummy","foo","bar"]
argtest.main()
输出:
['dummy', 'foo', 'bar']
您可以将字符串列表传递给 parse_args
:
parser.parse_args(['--foo', 'FOO'])
Python argparse 现在有一个参数 nargs
for add_argument
(https://docs.python/3/library/argparse.html).
它允许我们为命名参数设置任意数量的参数(这里,alist
)
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--alist", nargs="*")
args = parser.parse_args()
print(args.alist)
--alist
之后的所有命令行值都添加到列表中。
示例:
$ python3 argparse-01.py --alist fred barney pebbles "bamm bamm"
['fred', 'barney', 'pebbles', 'bamm bamm']
如您所见,可以引用参数,但没有必要,除非您需要保护 space.