Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python argparse在遇到'$';_Python_Python 3.x_Command Line Arguments_Argparse - Fatal编程技术网

python argparse在遇到'$';

python argparse在遇到'$';,python,python-3.x,command-line-arguments,argparse,Python,Python 3.x,Command Line Arguments,Argparse,我正在尝试使用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) 当我用下面的命

我正在尝试使用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试图用它的值替换它。

Jut打开终端/控制台并在shell中键入(这在bash和fish中都适用):

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

echo "hi\$test" # prints hi$test since $ is escaped
如果您想查看Python实际从shell接收到什么作为参数,请直接检查
sys.argv
(这就是
argparse
和其他类似模块读取命令行参数的地方)


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

尝试转义
$
,使用
/$
而不是查看
sys.argv
以查看
argparse
必须处理的内容。除了使用“\”转义之外,还有其他方法吗?这取决于您的shell。Bash非常常见,所以我假设您正在使用Bash。例如,我使用fish,而
echo“hi$test$”
不运行(fish抱怨最后一个
$
,它是一个没有名称的变量),但是bash忽略了它,并将其视为一个字面的美元符号。但最常见的防止插值的方法(据我所知)是使用单引号或反斜杠转义。
echo "hi\$test" # prints hi$test since $ is escaped
import sys
print sys.argv