gpt4 book ai didi

python - sys.argv 作为 Python 3k 中的字节

转载 作者:太空狗 更新时间:2023-10-29 20:52:41 24 4
gpt4 key购买 nike

由于 Python 3k 在字符串和字节之间引入了严格的区别,数组 sys.argv 中的命令行参数以字符串形式呈现。有时有必要将参数视为字节,例如在传递不需要采用 Unix 中任何特定字符编码的路径时。

让我们看一个例子。一个简短的 Python 3k 程序 argv.py 如下:

import sys

print(sys.argv[1])
print(b'bytes')

当它作为 python3.1 argv.py français 执行时,它会产生预期的输出:

français

b'bytes'

请注意,参数 français 在我的语言环境编码中。然而,当我们以不同的编码传递参数时,我们会得到一个错误:python3.1 argv.py `echo français|iconv -t latin1`

Traceback (most recent call last):
File "argv.py", line 3, in <module>
print(sys.argv[1])
UnicodeEncodeError: 'utf-8' codec can't encode character '\udce7' in position 4: surrogates not allowed

我们如何通过命令行参数将二进制数据传递给 Python 3k 程序?一个用法示例是将路径传递给使用其他语言环境的用户的文件。

最佳答案

请注意错误是 UnicodeEncodeError 而不是 UnicodeDecodeError。 Python 保留了在命令行上传递的确切字节(通过 PEP 383 surrogateescape 错误处理程序),但这些字节不是有效的 UTF-8,因此不能这样编码以写入控制台。

处理此问题的最佳方法是使用正确编码的应用程序级知识来重新解释应用程序内部的命令行参数,如以下示例代码所示:

$ python3.2 -c "import os, sys; print(os.fsencode(sys.argv[1]).decode('latin-1'))" `echo français|iconv -t latin1`
français

os.fsencode 函数调用反转 Python 在处理命令行参数时自动应用的转换。 decode('latin-1') 方法调用然后执行正确的转换以获得正确解码的字符串。

Python 3.2 专门加入了os.fsencode,让这类问题更容易处理。

对于 Python 3.1os.fsencode(sys.argv[1]) 的等效结构是 sys.argv[1].encode(sys .getfilesystemencoding(), 'surrogateescape')

2013 年 2 月编辑:针对 Python 3.2+ 进行了更新,并避免假设 Python 自动检测“UTF-8”作为命令行编码

关于python - sys.argv 作为 Python 3k 中的字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6981594/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com