python argparse 在遇到 '$' 后停止解析

python argparse stops parsing after it encounters '$'

我正在尝试使用 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遇到特殊字符就停止解析?

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

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

只需打开 terminal/console 并在 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$(最后一个美元符号保留在那里,因为它只是一个美元符号,不能是变量的名称)。