【已解决】测试Python 3.x中的argparse是否支持输入参数中包含花at符号(ampersand,’&’)

【问题】

别人问的问题:

主题:parser.parse_args() 不能识别带&的字符串,请教如何解决,谢谢!

消息正文:
crifan:
你好,使用argparse的时候发现输入值不能带&,请问如何解决,谢谢!
使用的python v3.3版本
测试代码如下:

import argparse
def urlType(rawValue):
    if not rawValue.startswith('http'):
        value = 'http://' + rawValue
    else:
        value = rawValue
    return value
parser = argparse.ArgumentParser(description='A Web crawler ')

parser.add_argument('-u',type=urlType,required=True,metavar='URL',dest='url',
                    help='Specify the begin url')
print("-----------------------------")
args = parser.parse_args()
print(args)

 

在Windows下输入:

argtest.py -u http://tieba.baidu.com%ere&2

报错:

—————————–

Namespace(url=’http://tieba.baidu.com%ere’)

‘2’ 不是内部或外部命令,也不是可运行的程序

或批处理文件。

 

【解决过程】

1.自己去测试测试看看。

然后测试代码为:

#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
-------------------------------------------------------------------------------
Function:
【已解决】测试Python 3.x中的argparse是否支持输入参数中包含花at符号(ampersand,'&')
http://www.crifan.com/python_3_argparse_parse_args_can_not_recognize_ampersand

Author:     Crifan Li
Verison:    2013-11-25
Contact:    http://www.crifan.com/about/me
-------------------------------------------------------------------------------
"""

import argparse

def argparse_ampersand(rawValue):
    """test python 3.x argparse parse input para contain ampersand '&' """
    parser = argparse.ArgumentParser(description="test python 3.x argparse parse input para contain ampersand '&'")
    parser.add_argument('-u', type=url, required=True, metavar='URL', dest='url', help='Specify the begin url')
    print("test python 3.x argparse parse input para contain ampersand '&'")
    args = parser.parse_args()
    print("parsed input args=", args);

if __name__=="__main__":
    argparse_ampersand();

测试结果是:

F:\argparse_ampersand>argparse_ampersand.py

Traceback (most recent call last):

  File "F:\argparse_ampersand\argparse_ampersand.py", line 25, in <module>

    argparse_ampersand();

TypeError: argparse_ampersand() takes exactly 1 argument (0 given)

F:\argparse_ampersand>argparse_ampersand.py -u http://tieba.baidu.com%ere&2

Traceback (most recent call last):

  File "F:\argparse_ampersand\argparse_ampersand.py", line 26, in <module>

    argparse_ampersand();

TypeError: argparse_ampersand() takes exactly 1 argument (0 given)

‘2’ 不是内部或外部命令,也不是可运行的程序

或批处理文件。

F:\argparse_ampersand>argparse_ampersand.py -u http://tieba.baidu.com%ere\&2

Traceback (most recent call last):

  File "F:\argparse_ampersand\argparse_ampersand.py", line 26, in <module>

    argparse_ampersand();

TypeError: argparse_ampersand() takes exactly 1 argument (0 given)

‘2’ 不是内部或外部命令,也不是可运行的程序

或批处理文件。

F:\argparse_ampersand>argparse_ampersand.py -u http://tieba.baidu.com%ere\\&2

Traceback (most recent call last):

  File "F:\argparse_ampersand\argparse_ampersand.py", line 26, in <module>

    argparse_ampersand();

TypeError: argparse_ampersand() takes exactly 1 argument (0 given)

‘2’ 不是内部或外部命令,也不是可运行的程序

或批处理文件。

F:\argparse_ampersand>argparse_ampersand.py -u http://tieba.baidu.com%ere’&’2

Traceback (most recent call last):

  File "F:\argparse_ampersand\argparse_ampersand.py", line 26, in <module>

    argparse_ampersand();

TypeError: argparse_ampersand() takes exactly 1 argument (0 given)

”2′ 不是内部或外部命令,也不是可运行的程序

或批处理文件。

F:\argparse_ampersand>

如图:

direct input ampersand not work even slash

即:

还是无法直接输入带&的字符,即使加了反斜杠等转义字符,也不行。

2.参考:

How can I recognise the argv correctly in python cmd?

去给参数值,加上双引号:

结果是:

F:\argparse_ampersand>argparse_ampersand.py -u "http://tieba.baidu.com%ere&2"

Traceback (most recent call last):

  File "F:\argparse_ampersand\argparse_ampersand.py", line 26, in <module>

    argparse_ampersand();

TypeError: argparse_ampersand() takes exactly 1 argument (0 given)

F:\argparse_ampersand>argparse_ampersand.py "-u http://tieba.baidu.com%ere&2"

Traceback (most recent call last):

  File "F:\argparse_ampersand\argparse_ampersand.py", line 26, in <module>

    argparse_ampersand();

TypeError: argparse_ampersand() takes exactly 1 argument (0 given)

F:\argparse_ampersand>argparse_ampersand.py "-u" "http://tieba.baidu.com%ere&2"

Traceback (most recent call last):

  File "F:\argparse_ampersand\argparse_ampersand.py", line 26, in <module>

    argparse_ampersand();

TypeError: argparse_ampersand() takes exactly 1 argument (0 given)

F:\argparse_ampersand>argparse_ampersand.py "-u" "http://tieba.baidu.com%ere&2"

Traceback (most recent call last):

  File "F:\argparse_ampersand\argparse_ampersand.py", line 26, in <module>

    argparse_ampersand();

TypeError: argparse_ampersand() takes exactly 1 argument (0 given)

F:\argparse_ampersand>argparse_ampersand.py -u http://tieba.baidu.com%ere^&2

Traceback (most recent call last):

  File "F:\argparse_ampersand\argparse_ampersand.py", line 26, in <module>

    argparse_ampersand();

TypeError: argparse_ampersand() takes exactly 1 argument (0 given)

F:\argparse_ampersand>python argparse_ampersand.py -u http://tieba.baidu.com%ere^&2

‘python’ 不是内部或外部命令,也不是可运行的程序

或批处理文件。

F:\argparse_ampersand>

即:

貌似,是可以了。

只是出现了其他的:

TypeError:  xxx takes exactly 1 argument (0 given)

的错误。

3.所以参考我自己之前的代码:

【整理】Python中如何获得并处理命令行参数

改为:

#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
-------------------------------------------------------------------------------
Function:
【已解决】测试Python 3.x中的argparse是否支持输入参数中包含花at符号(ampersand,'&')
http://www.crifan.com/python_3_argparse_parse_args_can_not_recognize_ampersand

Author:     Crifan Li
Verison:    2013-11-25
Contact:    http://www.crifan.com/about/me
-------------------------------------------------------------------------------
"""

import argparse

def argparse_ampersand(rawValue):
    """test python 3.x argparse parse input para contain ampersand '&' """
    parser = argparse.ArgumentParser(description="test python 3.x argparse parse input para contain ampersand '&'")
    newParser.add_argument("-u", "--url", dest="url", help="Specify the begin url");
    #parser.add_argument('-u', type=url, required=True, metavar='URL', dest='url', help='Specify the begin url')
    print("test python 3.x argparse parse input para contain ampersand '&'")
    args = parser.parse_args()
    print("parsed input args=", args);

if __name__=="__main__":
    argparse_ampersand();

再去试试:

结果问题依旧。

4.后来发现貌似是print的少了格式化的%s,加上后,变成:

#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
-------------------------------------------------------------------------------
Function:
【已解决】测试Python 3.x中的argparse是否支持输入参数中包含花at符号(ampersand,'&')
http://www.crifan.com/python_3_argparse_parse_args_can_not_recognize_ampersand

Author:     Crifan Li
Verison:    2013-11-25
Contact:    http://www.crifan.com/about/me
-------------------------------------------------------------------------------
"""

import argparse

def argparse_ampersand(rawValue):
    """test python 3.x argparse parse input para contain ampersand '&' """
    parser = argparse.ArgumentParser(description="test python 3.x argparse parse input para contain ampersand '&'")
    newParser.add_argument("-u", "--url", dest="url", help="Specify the begin url");
    #parser.add_argument('-u', type=url, required=True, metavar='URL', dest='url', help='Specify the begin url')
    print("test python 3.x argparse parse input para contain ampersand '&'")
    args = parser.parse_args()
    print("parsed input args=%s", args);

if __name__=="__main__":
    argparse_ampersand();

再去试试,

问题依旧。

5.后来才发现,原来是:

line 27,即27行的

argparse_ampersand();

出错的。。。

对应的定义是:

def argparse_ampersand(rawValue):

所以是:

笔误,弄出个多余的参数。。。而搞的鬼。

所以改为:

#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
-------------------------------------------------------------------------------
Function:
【已解决】测试Python 3.x中的argparse是否支持输入参数中包含花at符号(ampersand,'&')
http://www.crifan.com/python_3_argparse_parse_args_can_not_recognize_ampersand

Author:     Crifan Li
Verison:    2013-11-25
Contact:    http://www.crifan.com/about/me
-------------------------------------------------------------------------------
"""

import argparse

def argparse_ampersand():
    """test python 3.x argparse parse input para contain ampersand '&' """
    parser = argparse.ArgumentParser(description="test python 3.x argparse parse input para contain ampersand '&'")
    #newParser.add_argument("-u", "--url", dest="url", help="Specify the begin url");
    parser.add_argument('-u', type=url, required=True, metavar='URL', dest='url', help='Specify the begin url')
    print("test python 3.x argparse parse input para contain ampersand '&'")
    args = parser.parse_args()
    print("parsed input args=", args);

if __name__=="__main__":
    argparse_ampersand();

再去试试:

结果又出现了:

F:\argparse_ampersand>argparse_ampersand.py -u http://tieba.baidu.com%ere^&2

Traceback (most recent call last):

  File "F:\argparse_ampersand\argparse_ampersand.py", line 27, in <module>

    argparse_ampersand();

  File "F:\argparse_ampersand\argparse_ampersand.py", line 21, in argparse_ampersand

    parser.add_argument(‘-u’, type=url, required=True, metavar=’URL’, dest=’url’, help=’Specify the begin url’)

NameError: global name ‘url’ is not defined

6.再去改为:

#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
-------------------------------------------------------------------------------
Function:
【已解决】测试Python 3.x中的argparse是否支持输入参数中包含花at符号(ampersand,'&')
http://www.crifan.com/python_3_argparse_parse_args_can_not_recognize_ampersand

Author:     Crifan Li
Verison:    2013-11-25
Contact:    http://www.crifan.com/about/me
-------------------------------------------------------------------------------
"""

import argparse

def argparse_ampersand():
    """test python 3.x argparse parse input para contain ampersand '&' """
    parser = argparse.ArgumentParser(description="test python 3.x argparse parse input para contain ampersand '&'")
    parser.add_argument("-u", "--url", dest="url", help="Specify the begin url");
    #parser.add_argument('-u', type=url, required=True, metavar='URL', dest='url', help='Specify the begin url')
    print("test python 3.x argparse parse input para contain ampersand '&'")
    args = parser.parse_args()
    print("parsed input args=", args);

if __name__=="__main__":
    argparse_ampersand();

结果是:

F:\argparse_ampersand>argparse_ampersand.py -u http://tieba.baidu.com%ere^&2

test python 3.x argparse parse input para contain ampersand ‘&’

parsed input args= Namespace(url=’http://tieba.baidu.com%ere&2′)

F:\argparse_ampersand>argparse_ampersand.py -u "http://tieba.baidu.com%ere&2"

test python 3.x argparse parse input para contain ampersand ‘&’

parsed input args= Namespace(url=’http://tieba.baidu.com%ere&2′)

F:\argparse_ampersand>argparse_ampersand.py -u ‘http://tieba.baidu.com%ere&2′

test python 3.x argparse parse input para contain ampersand ‘&’

parsed input args= Namespace(url="’http://tieba.baidu.com%ere")

‘2” 不是内部或外部命令,也不是可运行的程序

或批处理文件。

F:\argparse_ampersand>argparse_ampersand.py "-u http://tieba.baidu.com%ere&2"

test python 3.x argparse parse input para contain ampersand ‘&’

parsed input args= Namespace(url=’ http://tieba.baidu.com%ere&2′)

如图:

add quote for para containing ampersand or prev add circumflex accent also ok

 

【总结】

Python 3.x中,使用argparse去解析输入参数,其中包含&的话:

有两种解决办法:

1.可以在单个的&前面加上上尖括号’^’去转义&,即可:

argparse_ampersand.py -u http://tieba.baidu.com%ere^&2

2.或者是,给整个单个参数加上双引号,也可以的:

argparse_ampersand.py -u "http://tieba.baidu.com%ere&2"

注:

1.加单引号:

argparse_ampersand.py -u http://tieba.baidu.com%ere&2

是不行的。

2.给整个参数部分加上双引号:

argparse_ampersand.py "-u http://tieba.baidu.com%ere&2"

虽然是可以,但是会导致解析后的值,是包含空格的:

Namespace(url=’ http://tieba.baidu.com%ere&2′)

与此对应的,正常的值是没空格的:

Namespace(url=’http://tieba.baidu.com%ere&2′)

所以还是不推荐整个参数部分加双引号,还是单独给包含特殊字符(此处的&)的参数去加双引号就行了。



发表评论

电子邮件地址不会被公开。 必填项已用*标注

无觅相关文章插件,快速提升流量