2016-05-17 118 views
1

我试图用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在遇到特殊字符后停止解析?

+1

尝试使用'/ $'转义'''转而使用'/ $' – Keatinge

+1

查看'sys.argv'来查看'argparse'必须使用的内容。 – hpaulj

回答

3

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

突出部分打开一个终端/主机,并在壳键入此(此工作在两个bash和鱼):

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

这发生在壳启动应用处理之前。所以 我想在调用你的应用程序时,你需要传递单引号引用的字符串,或者用反斜杠转义$

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

如果你希望看到什么实际的Python从shell作为参数接收,直接检查sys.argv(这就是​​和其他模块一样读取命令行参数)。

import sys 
print sys.argv 

在问题的这种特殊情况下,会发生什么是你的脚本解析input$output$,并试图插值变量$output,但没有定义这样的变量,所以它被用空字符串替换。那么实际上传递给Python的是input$(最后一个美元符号留在那里,因为它只是一个美元符号,不能是变量的名称)。

+0

有没有其他方法可以用'\'来转义。 –

+0

取决于你的外壳。 Bash很常见,所以我假设你使用bash。例如我使用fish和'echo“hi $ test $”'不运行(fish抱怨最后一个'$'这是一个没有名字的变量),但bash忽略它并将其视为字面美元符号。但是防止插值(我知道的)最常用的方法是使用单引号或使用反斜线进行转义。 – farzad

+0

“使用单引号”。这解决了问题 –

0

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