如何在Python中从环境变量设置字符串?

yba*_*kos 6 python

假设您有一个字符串生成,通过os.urandom(24),

b'\x1b\xba\x94(\xae\xd0\xb2\xa6\xf2f\xf6\x1fI\xed\xbao$\xc6D\x08\xba\x81\x96v'
Run Code Online (Sandbox Code Playgroud)

并且你想将它存储在环境变量中,

export FOO='\x1b\xba\x94(\xae\xd0\xb2\xa6\xf2f\xf6\x1fI\xed\xbao$\xc6D\x08\xba\x81\x96v'
Run Code Online (Sandbox Code Playgroud)

并使用从Python程序中检索值os.environ.

foo = os.environ['FOO']
Run Code Online (Sandbox Code Playgroud)

问题是,这里foo有字符串文字值'\\x1b\\xba\\x94...而不是字节序列b'\x1b\xba\x94....

什么是正确export使用的值来使用,或手段os.environ对待FOO作为一个字节串?

zwe*_*wer 6

您可以使用以下命令在 Python 中“取消转义”您的字节:

import os
import sys

if sys.version_info[0] < 3:  # sadly, it's done differently in Python 2.x vs 3.x
    foo = os.environ["FOO"].decode('string_escape')  # since already in bytes...
else:
    foo = bytes(os.environ["FOO"], "utf-8").decode('unicode_escape')
Run Code Online (Sandbox Code Playgroud)

  • 您的 Py3 解决方案生成一个 `str`,而不是一个 `bytes` 对象,并且不必要地将字符串形式转换为 `bytes`。将第二行替换为:`foo = os.environb[b'FOO'].decode('unicode-escape').encode('latin-1')` 使其从 `os.environb`(`面向字节的环境视图),解码转义符,然后转换回原始的“字节”(“latin-1”是一个 1-1 映射,它将前 256 个 Unicode 序数映射到它们作为字节的序数值)。 (3认同)

mik*_*n32 5

还有一个选项,只需在Bash中将其设置为二进制数据即可.这使用ANSI字符串引用:

export FOO=$'\x1b\xba\x94(\xae\xd0\xb2\xa6\xf2f\xf6\x1fI\xed\xbao$\xc6D\x08\xba\x81\x96v'
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的方法,因为它使得在Python中读取数据就像`os.environ ['FOO']`(Py2)或`os.environb [b'FOO']`(Py3)一样简单,所以你得到了Python中的数据作为原始`bytes`,根本不需要编码或解码.我完全忘记了Bash的这个功能,所以感谢提醒! (2认同)