我试图弄清楚如何使用argparser执行以下操作:
$ python test.py executeBuild --name foobar1 executeBuild --name foobar2 ....
getBuild
本身是一个子命令。我的目标是使脚本具有链接一系列子命令(executeBuild
成为其中一个命令)并按顺序执行它们的能力。在上面的示例中,它将执行构建,然后设置环境,然后再次执行构建。如何使用argparse完成此操作?我尝试了以下方法:
main_parser = argparse.ArgumentParser(description='main commands')
subparsers = main_parser.add_subparsers(help='SubCommands', dest='command')
build_parser = subparsers.add_parser('executeBuild')
build_parser.add_argument('--name', action='store', nargs=1, dest='build_name')
check_parser = subparsers.add_parser('setupEnv')
args, extra=main_parser.parse_known_args()
但是,似乎每次执行此操作时,它都会进入子命令executeBuild
并报告它不知道是什么executeBuild
。我尝试解析额外的内容,以便可以执行重复调用/链,但是,第一个视图属性似乎已被覆盖,因此,我什至不能只保存额外的选项并进行遍历。
您在问的argparse
东西不是为它写的:它很好地解析了一个命令行(但只有一个),并且您想在一行中解析多个命令。恕我直言,您必须对参数数组进行初始分割,然后argparse
在每个子命令上使用。接下来的函数接受一个参数列表(可以是sys.argv
),跳过从每个已知子命令开始的数组中剩余的第一个和拆分。然后,您可以在每个子列表上使用argparse:
def parse(args, subcommands):
cmds = []
cmd = None
for arg in args[1:]:
if arg in (subcommands):
if cmd is not None:
cmds.append(cmd)
cmd = [arg]
else:
cmd.append(arg)
cmds.append(cmd)
return cmds
在您的示例中:
parse(['test.py', 'executeBuild', '--name', 'foobar1', 'executeBuild', '--name', 'foobar2'],
('executeBuild',))
=>
[['executeBuild', '--name', 'foobar1'], ['executeBuild', '--name', 'foobar2']]
限制:子命令用作保留字,不能用作选项参数。
问题内容: 我想运行一些命令,直到按Ctrl-C才会退出。是否可以运行一次即可运行所有这些程序,而Ctrl-C会全部退出它们?他们可以共享终端输出。 具体来说,我有罗盘编译器,coffeescript编译器和一个自定义命令,用于监视文件更改,所有命令都在运行以监视文件更改。我不想为每个命令加载一个终端。 问题答案: 该bash脚本适用于N个并行线程。每个参数都是一个命令。 捕获SIGINT时将杀死
问题内容: 我在弄清楚如何使用os / exec包运行多个命令时遇到了麻烦。我已经摸索了网络和stackoverflow,还没有找到任何适合我的案例。这是我的资料来源: 我想要命令,就像从终端一样。 因此,我需要依次运行每个命令,并等待最后一个命令完成后再继续。在当前版本的代码中,当前假设是因为执行cd path并在新的shell中执行了./configure,而不是与上一个命令位于同一目录中。有
问题内容: 如果我在bash中运行,结果将是两个命令都运行。但是,如果我使用子进程,则将运行第一个命令,打印出该行其余部分的全部内容。下面的代码回显而不是,我如何才能运行两个命令? 问题答案: 您必须在子进程中使用shell = True,而不能使用shlex.split: 返回:
问题内容: 我正在开发一个Java应用程序,该应用程序偶尔会在Windows计算机上运行。在某个时候,我需要运行Cygwin提示符并在其中执行一些命令。 我找到了一个使用Runtime类的主题:http : //www.javaquery.com/2011/03/how-to-execute- multiple-command-in.html 但是,它不会启动真正的 cmd.exe 窗口,它仅在后
问题内容: 我试图在一行中合并多个Linux命令以执行部署操作。例如 问题答案: 如果仅在上一个命令成功的情况下才执行每个命令,请使用运算符将它们组合: 如果其中一个命令失败,则将不执行其后的所有其他命令。 如果要执行所有命令而不管先前的命令是否失败,请使用分号将它们分开: 在您的情况下,我想您希望第一种情况下,下一条命令的执行取决于上一条命令的成功。 您还可以将所有命令放在脚本中,然后执行该脚本
我的设置。我有三台PC:MyComp,Server1和Server2,两个类似的脚本使用调用命令RemTest1.ps1,它在远程Server1上调用RemTest2.ps1。RemTest2 使用 invoke-command 在 Server2 上运行脚本块。我使用的是Powershell版本5.1当我运行脚本从MyComp到Server1时,它工作正常。当我从Server1运行到Server