在 python 中以二进制形式访问系统输入



我是Python 3对Unicode问题的前景的粉丝。但是在一个地方,我不确定它在做什么。

据我了解,argv 和环境变量以字节的形式从操作系统传输到 python 可执行文件。Python选择一种编码,数据以sys.argvos.environ中的Unicode字符串的形式暴露给用户程序。

我不知道python是如何选择这种编码的。我以为是LC变量,但这似乎不起作用。

$ printf -v CENTS 'xC2xA2' ; export CENTS ; echo "0xC2 0xA2 in UTF-8 is $CENTS"
0xC2 0xA2 in UTF-8 is ¢
$ printf -v LBS 'xC2xA3' ; echo "0xC2 0xA3 in UTF-8 is $LBS"
0xC2 0xA3 in UTF-8 is £
$ cat <<EOF >test.py
import os, sys
print("0xC2 0xA2 decodes to", *(hex(ord(c)) for c in os.environ.get("CENTS")))
print("0xC2 0xA3 decodes to", *(hex(ord(c)) for c in sys.argv[1]))
EOF
$ python3 test.py $LBS
0xC2 0xA2 decodes to 0xa2
0xC2 0xA3 decodes to 0xa3
$ LC_ALL=es_ES.ISO8859-1 python3 test.py $LBS
0xC2 0xA2 decodes to 0xa2
0xC2 0xA3 decodes to 0xa3

我以为第二个会给0xc2 0xa2和0xc2 0xa3,但似乎LC_ALL没有区别。

有没有办法绕过编码,只看到提供给可执行文件的二进制数据?

或者,Python 如何选择编码以及在哪里公开它?我以为它是在sys.getfilesystemencoding()中暴露的,但它的文档非常稀疏,没有澄清任何事情。指向官方文档的指针将不胜感激。

根据链接的答案和它们引用的文档,这里有一个简短的答案:

有关os.environ,请参阅os.environb,它在非 Windows 系统上可用,并提供对底层字节的直接访问。

sys.argv 使用系统确定的编码(取自我认为LANG(的专门种类自动解码为 Unicode 对象,并且原始字节不会直接暴露。要访问它们,我认为或多或少是可靠的,您可以使用os.fsencode.

我有一种感觉,这可以玩弄,但我稍后会跟进。

最新更新