Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中设置环境变量的字节字符串?_Python - Fatal编程技术网

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

如何在Python中设置环境变量的字节字符串?,python,Python,假设您有一个通过os.uradom(24)生成的字节串 您希望将其存储在环境变量中 export FOO='\x1b\xba\x94(\xae\xd0\xb2\xa6\xf2f\xf6\x1fI\xed\xbao$\xc6D\x08\xba\x81\x96v' 并使用os.environ从Python程序中检索值 foo = os.environ['FOO'] 问题是,在这里,foo具有字符串文本值'\\x1b\\xba\\x94…,而不是字节序列b'\x1b\xba\x94… 使用什么适当

假设您有一个通过
os.uradom(24)
生成的字节串

您希望将其存储在环境变量中

export FOO='\x1b\xba\x94(\xae\xd0\xb2\xa6\xf2f\xf6\x1fI\xed\xbao$\xc6D\x08\xba\x81\x96v'
并使用
os.environ
从Python程序中检索值

foo = os.environ['FOO']
问题是,在这里,
foo
具有字符串文本值
'\\x1b\\xba\\x94…
,而不是字节序列
b'\x1b\xba\x94…


使用什么适当的
export
值,或者使用
os.environ
FOO
视为一个字节字符串?

您可以使用以下命令在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')
导入操作系统
导入系统
如果sys.version_info[0]<3:#很遗憾,在Python2.x和3.x中的做法有所不同
foo=os.environ[“foo”].decode('string_escape')#因为已在字节中。。。
其他:
foo=字节(os.environ[“foo”],“utf-8”).decode('unicode_escape'))

根据zwer的回答,我尝试了以下方法

首先来自bash(这与ybakos给出的二进制文本相同)

然后我启动了python shell(我有python 3.5.2)

foo==foo的最后一行应该返回true,因此解决方案似乎无法正常工作

我注意到有一个字典,但我不知道如何将环境变量设置为二进制文本,所以我尝试了以下替代方法,使用base64编码获得二进制文本的ASCII版本

第一次启动pythonshell

>>> import os
>>> import base64
>>> foo = os.urandom(24)
>>> foo
b'{\xd9q\x90\x8b\xba\xecv\xb3\xcb\x1e<\xd7\xba\xf1\xb4\x99\xf056\x90U\x16\xae'
>>> foo_base64 = base64.b64encode(foo)
>>> foo_base64
b'e9lxkIu67Hazyx4817rxtJnwNTaQVRau'
>>> ^D
>>> import os
>>> import base64
>>> # the original binary value from the first python shell session
>>> foo = b'{\xd9q\x90\x8b\xba\xecv\xb3\xcb\x1e<\xd7\xba\xf1\xb4\x99\xf056\x90U\x16\xae'
>>> dec_foo = base64.b64decode(bytes(os.environ.get('FOO_BASE64'), "utf-8"))
>>> # the values match!
>>> foo == dec_foo
True
>>> ^D
然后回到python shell中

>>> import os
>>> import base64
>>> foo = os.urandom(24)
>>> foo
b'{\xd9q\x90\x8b\xba\xecv\xb3\xcb\x1e<\xd7\xba\xf1\xb4\x99\xf056\x90U\x16\xae'
>>> foo_base64 = base64.b64encode(foo)
>>> foo_base64
b'e9lxkIu67Hazyx4817rxtJnwNTaQVRau'
>>> ^D
>>> import os
>>> import base64
>>> # the original binary value from the first python shell session
>>> foo = b'{\xd9q\x90\x8b\xba\xecv\xb3\xcb\x1e<\xd7\xba\xf1\xb4\x99\xf056\x90U\x16\xae'
>>> dec_foo = base64.b64decode(bytes(os.environ.get('FOO_BASE64'), "utf-8"))
>>> # the values match!
>>> foo == dec_foo
True
>>> ^D
导入操作系统 >>>导入base64 >>>#来自第一个python shell会话的原始二进制值
>>>foo=b'{\xd9q\x90\x8b\xba\xecv\xb3\xcb\x1e最简单的选择是在Bash中将其设置为二进制数据。这使用并避免了在Python端进行任何类型的转换

export FOO=$'\x1b\xba\x94(\xae\xd0\xb2\xa6\xf2f\xf6\x1fI\xed\xbao$\xc6D\x08\xba\x81\x96v'

这比你想象的要简单。只需将其存储为平面字符串并对字符串进行编码。它将返回二进制数据。例如:

foo = '{\xd9q\x90\x8b\xba\xecv\xb3\xcb\x1e<\xd7\xba\xf1\xb4\x99\xf056\x90U\x16\xae'
B_FOO = str.encode(foo)

foo='{\xd9q\x90\x8b\xba\xecv\xb3\xcb\x1ec可能是因为单引号。我很困惑;如果你在Python中打印(repr)
foo
它来自类似于
os.uradom
的东西,并查看
b'\x1b\xba…”
,那么它就是(在Python中)原始字节。如果您从envvar读取它并看到
'\\x1b\\xba'
,则它是一个(Unicode)仍然转义的字符串。根据,bash似乎不会将您的
导出FOO
行解释为真正的二进制,而是一个包含大量
\x
的字符串。另一种选择是将字节保存在二进制文件中,并将文件名用作环境变量Py3解决方案生成
str
,而不是
字节
对象,不必要地将字符串形式转换为
字节
。将第二行替换为:
foo=os.environb[b'foo'].decode('unicode-escape')。encode('latin-1')
,以使其从
os.environb
读取(面向
字节的环境视图),对转义进行解码,然后转换回原始的
字节
latin-1
是一种1-1映射,它将前256个Unicode序号映射到它们的序号值(作为字节)。这是一种很好的方法,因为它使Python中的数据读取像
os.environ['FOO']
(Py2)或
os.environb[b'FOO']
(Py3)一样简单,因此您可以在Python中以原始
字节的形式获取数据,而无需编码或解码。我已经完全忘记了Bash的这一功能,因此感谢您的提醒!感谢您提供了答案,但这与问题及其描述的问题或情况无关。是的,我刚刚意识到这个问题来自environ变量。可能我会删除这个。
export FOO=$'\x1b\xba\x94(\xae\xd0\xb2\xa6\xf2f\xf6\x1fI\xed\xbao$\xc6D\x08\xba\x81\x96v'
foo = '{\xd9q\x90\x8b\xba\xecv\xb3\xcb\x1e<\xd7\xba\xf1\xb4\x99\xf056\x90U\x16\xae'
B_FOO = str.encode(foo)