不要从命令行读取 unicode?



运行Python 2.7

执行时:

$ python client.py get_emails -a "åäö"

我得到:

usage: client.py get_emails [-h] [-a AREA] [-t {rfc2822,plain}]
client.py get_emails: error: argument -a/--area: invalid unicode value: 'xc3xa5xc3xa4xc3xb6'

这是我的解析器:

def _argparse():
    desc = """
           Simple CLI-client for...
           """
    argparser = argparse.ArgumentParser(description=desc)
    subparsers = argparser.add_subparsers(dest='command')
    # create the parser for the "get_emails" command
    parser_get_emails = subparsers.add_parser('get_emails', help=u'Get email list')
    parser_get_emails.add_argument('-a', '--area', type=unicode, help='Limit to area')
    parser_get_emails.add_argument('-t', '--out_type', choices=['rfc2822', 'plain'],
                                   default='rfc2822', help='Type of output')
    args = argparser.parse_args()
    return args

这是否意味着我不能在python argparse模块中使用任何unicode字符?

你可以

试试

type=lambda s: unicode(s, 'utf8')

而不是

type=unicode

如果不编码参数 unicode() 默认为 ascii。

命令行参数使用以下sys.getfilesystemencoding()进行编码:

import sys
def commandline_arg(bytestring):
    unicode_string = bytestring.decode(sys.getfilesystemencoding())
    return unicode_string
# ...
parser_get_emails.add_argument('-a', '--area', type=commandline_arg)

注意:在 Python 3 中不需要它(参数已经是 Unicode)。在这种情况下,它使用os.fsdecode()因为有时命令行参数可能是不可执行的。请参阅 PEP 383 -- 系统字符接口中的不可解码字节。

相关内容

  • 没有找到相关文章

最新更新