【问题标题】:python argparse stops parsing after it encounters '$'python argparse在遇到'$'后停止解析
【发布时间】:2016-09-13 17:00:28
【问题描述】:

我正在尝试使用 argparse 解析命令行

from argparse import ArgumentParser

argparser = ArgumentParser(prog="parse", description="desc")

create.add_argument("--name",dest="name",required=True,help="Name for element")
args = argparser.parse_args()
print(args)

当我使用以下命令执行此操作时

python argparser.py  --name "input$output$"

输出是:

('args:', Namespace(name='input$'))

预期输出:

('args:', Namespace(name='input$output$'))

你能帮我弄清楚我做错了什么吗? 为什么argparse遇到特殊字符后停止解析?

【问题讨论】:

  • 尝试转义$,改用/$
  • 查看 sys.argv 以了解 argparse 必须使用的内容。

标签: python python-3.x command-line-arguments argparse


【解决方案1】:

这可能与您的 shell 环境有关,因为在bash 中,$ 表示变量的开始。 $output 可能会替换为空字符串。 $ 本身不会被替换。

【讨论】:

    【解决方案2】:

    这是因为大多数 shell 会将以 $ 开头的字符串视为变量,并且当用双引号引起来时,shell 会尝试将其替换为其值。

    打开一个终端/控制台并在 shell 中输入这个(这在 bash 和 fish 中都有效):

    echo "hi$test"  # prints hi trying to interpolate the variables 'test'
    echo 'hi$test' # prints hi$test no interpolation for single quotes
    

    这发生在 shell 启动应用程序进程之前。所以 我认为在调用您的应用程序时,您需要传入单引号引用的字符串,或者使用反斜杠转义 $

    echo "hi\$test" # prints hi$test since $ is escaped
    

    如果您想查看 Python 实际从 shell 作为参数接收的内容,请直接检查 sys.argv(这是 argparse 和其他类似模块读取命令行参数的地方)。

    import sys
    print sys.argv
    

    在问题的这种特定情况下,发生的情况是您的 shell 解析 input$output$ 并尝试插入变量 $output,但没有定义这样的变量,因此它被一个空字符串替换。所以实际上作为参数传递给 Python 的是input$(最后一个美元符号保留在那里,因为它只是一个美元符号,不能是变量的名称)。

    【讨论】:

    • 除了用 '\' 转义之外,还有其他方法吗?
    • 取决于你的外壳。 bash 很常见,所以我假设您使用的是 bash。例如,我使用 fish 并且 echo "hi$test$" 没有运行(fish 抱怨最后一个 $ 是一个没有名称的变量),但是 bash 忽略它并将其视为文字美元符号。但最常见的防止插值的方法(据我所知)是使用单引号,或者使用反斜杠转义。
    猜你喜欢
    • 1970-01-01
    • 2012-11-21
    • 2015-08-09
    • 2018-12-31
    • 2013-10-21
    • 2016-09-05
    • 2022-01-18
    • 1970-01-01
    • 2013-12-21
    相关资源
    最近更新 更多