【问题标题】:How to parse commands and arguments in Python?如何在 Python 中解析命令和参数?
【发布时间】:2019-12-06 05:11:54
【问题描述】:

我正在做一个命令行应用程序,并希望通过带参数的命令支持用户输入。 我所有的谷歌搜索都指向 argparse 库,但这似乎只解析参数(-h、-m、-i...),而不是命令(cd、rm...)。 我想要类似 Windows 命令提示符(command ...)的东西。

我已经尝试过 argparse 库。我可以指定参数并且解析工作正常。

我还考虑过创建一个不需要值的参数并将其视为命令。 示例:-c --name 'Bob' --age 37 Argparse 说'-c' 是一个参数,但我会将它用作命令。其余参数将被解析为常规参数。 但这似乎很老套,而且过于复杂。

另一种选择是自己解析第一个单词(命令),然后使用 argparse 解析剩余的单词(参数)。 但又一次 - 感觉过于复杂。

对于任何语言错误,我深表歉意 - 英语不是我的第一语言。

提前致谢。

编辑:抱歉,我没有说明用户何时以及如何输入命令。用户将打开应用程序并输入命令。 感谢@CharlesDuffy 指出这一点。

编辑 2:子解析器是我的问题的答案。 感谢@GZ0 的链接。

它是如何工作的:

我使用input() 获取用户输入,然后使用shlex 模块(@Amit 提到)将字符串拆分为一个列表。然后将该列表提供给argparse 中的parser.parse_args() 方法。

如果有人对这里的代码感兴趣,the link

【问题讨论】:

  • 第二个选项看起来完全有效并且没有那么复杂。您可以使用shlex 模块解析命令行,使用argparse 处理参数。
  • 看看argparse中的子解析器:stackoverflow.com/questions/17073688/…
  • “类似于 [操作系统] 命令提示符之类的东西”听起来你不是在要求 argparse,而是要求标准库 cmd 模块。 (而如果您确实要解析命令行参数列表,只是那些以子命令名称开头的列表,那么是的,您需要子解析器,正如 GZ0 已经建议的那样)。也就是说,如果没有具体的例子,很难知道你想做什么。 (是否有人启动您的程序,然后然后键入命令及其参数?)
  • @GZ0 谢谢!该链接非常有用。我已经设法弄清楚了。如果其他人将来遇到同样的问题,我会更新这个答案。

标签: python parameter-passing command-line-arguments argparse


【解决方案1】:

您正在寻找的是子流程模块 (https://docs.python.org/3/library/subprocess.html)。例如,如果您必须运行 bash 命令“ls -l”,您将按照文档执行以下操作。

import subprocess
subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)

文档还说“ shlex.split() 在确定 args 的正确标记化时很有用,尤其是在复杂情况下”

import shlex, subprocess
command_line = input()
## /bin/vikings -input eggs.txt -output "spam spam.txt" -cmd "echo '$MONEY'"
args = shlex.split(command_line)
print(args)
## ['/bin/vikings', '-input', 'eggs.txt', '-output', 'spam spam.txt', '-cmd', "echo '$MONEY'"]
p = subprocess.Popen(args) # Success!

我强烈建议您尽可能多地阅读文档并搜索教程。如果这是您要找的,请告诉我。

【讨论】:

    【解决方案2】:

    听起来sys 模块可以满足您对简单参数解析的需求。

    示例: myscript.py

    import sys
    print(sys.argv)
    
    $ python myscript.py ls and other args
    ['myscript.py', 'ls', 'and', 'other', 'args']
    

    sys.argv 包含传递给python 命令的所有参数。从这里,您可以随意使用它们。

    【讨论】:

      猜你喜欢
      • 2020-01-25
      • 2011-03-15
      • 1970-01-01
      • 2013-02-01
      • 2017-10-29
      • 2011-04-27
      • 2010-09-16
      • 2010-09-26
      • 2014-12-18
      相关资源
      最近更新 更多