は、私が試した次
のbashからの最初の(これは同じバイナリリテラルybakosによって与えられた)
export FOO='\x1b\xba\x94(\xae\xd0\xb2\xa6\xf2f\xf6\x1fI\xed\xbao$\xc6D\x08\xba\x81\x96v'
私はPythonシェルを起動しました(私はPython 3.5.2を持っています)
>>> import os
>>> # ybakos's original binary literal
>>> foo = b'\x1b\xba\x94(\xae\xd0\xb2\xa6\xf2f\xf6\x1fI\xed\xbao$\xc6D\x08\xba\x81\x96v'
>>> # ewer's python 3.x solution
>>> FOO = bytes(os.environ["FOO"], "utf-8").decode('unicode_escape')
>>> foo == FOO
False
>>> ^D
foo == FOOの最後の行はtrueを返す必要があるため、解決策は正しく動作するようには見えません。
私はos.envirnb辞書があることに気づいたが、私は、バイナリリテラルに環境変数を設定するために見つけ出すことができなかったので、私は、バイナリリテラルのASCIIバージョンを取得するためにbase64エンコーディングを使用して、次の選択肢を試してみました。 bashシェルに続い
まず起動Pythonシェル
>>> 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
を
export FOO_BASE64='e9lxkIu67Hazyx4817rxtJnwNTaQVRau'
そしてバックPythonシェルで
>>> 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
最後の行は2つの結果であることを示し同じ!!
私たちがやっていることは、まずos.urandom()とそれをエンコードするBase64からバイナリ値を取得します。次に、Base64エンコードされた値を使用して環境変数を設定します。注:base64.b64encode()はバイナリ値を返しますが、印刷可能なASCII文字のみを含みます。
次に、環境変数からBase64エンコード文字列値を読み込み、その文字列をバイナリ形式に変換し、最後にBase64で元の値にデコードします。
一重引用符が原因である可能性があります。 –
私は混乱しています。あなたが 'os.urandom'のようなものから来て、' b '\ x1b \ xba ...'を見て、Pythonで(repr) 'foo'を印刷するなら、(Pythonで)生のバイトです。 envvarから読み込んで ''\\ x1b \\ xba''を見ると、まだエスケープされている(Unicode)文字列です。 [この質問](https://stackoverflow.com/questions/43214001/how-to-write-binary-data-in-bash)によると、bashはあなたの 'export FOO'行を実際と解釈しないようですバイナリですが、 '\ x'の束が入った文字列です。 –