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

Access system input as binary in python

我是 Python 3 对 unicode 问题前景的支持。但是在一个地方我不确定它在做什么。

据我了解,argv 和环境变量以字节形式从 OS 传输到 python 可执行文件。 Python 选择一种编码,数据在 sys.argvos.environ.

中作为 unicode 字符串公开给用户程序

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

$ printf -v CENTS '\xC2\xA2' ; export CENTS ; echo "0xC2 0xA2 in UTF-8 is $CENTS"
0xC2 0xA2 in UTF-8 is ¢
$ printf -v LBS '\xC2\xA3' ; 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.

我觉得这可以玩,但我稍后会跟进。