os.urandom () decodificando problema

Estoy tratando de obtener una private_key , así que intenté esto:

private_key = os.urandom(32).encode('hex') 

Pero arroja este error:

 AttributeError: 'bytes' object has no attribute 'encode' 

Así que reviso las preguntas y resolví que, en Python3x, los bytes solo se pueden decodificar. Luego lo cambio por:

 private_key = os.urandom(32).decode('hex') 

Pero ahora lanza este error:

 LookupError: 'hex' is not a text encoding; use codecs.decode() to handle arbitrary codecs 

Y realmente no entendí por qué. Cuando intenté esto después del último error;

 private_key = os.urandom(32).codecs.decode('hex') 

Dice

AttributeError: el objeto ‘bytes’ no tiene atributo ‘codecs’

Así que me quedé atascado, ¿qué puedo hacer para solucionar esto? Escuché que esto funciona en Python 2x, pero necesito usarlo en 3x.

Utilice binascii.hexlify . Funciona tanto en Python 2.x como en Python 3.x.

 >>> import binascii >>> binascii.hexlify(os.urandom(32)) b'daae7948824525c1b8b59f9d5a75e9c0404e46259c7b1e17a4654a7e73c91b87' 

Si necesita un objeto de cadena en lugar de un objeto de bytes en Python 3.x, use decode() :

 >>> binascii.hexlify(os.urandom(32)).decode() 'daae7948824525c1b8b59f9d5a75e9c0404e46259c7b1e17a4654a7e73c91b87' 

En Python 3, el objeto de bytes no tiene el método .encode() (para reforzar la distinción entre el texto Unicode y los datos binarios (bytes)).

Para conversiones de bytes a bytes, puede usar el método codecs.encode() :

 import codecs import os print(codecs.encode(os.urandom(32), 'hex').decode()) 

Y a la inversa:

 print(codecs.decode(hex_text, 'hex')) # print representation of bytes object 

Nota: no hay .decode() llamada a .decode() porque los bytes devueltos por os.urandom no tienen encoding de caracteres (no es un texto, es solo una secuencia aleatoria de bytes).

codecs pueden usar binascii.hexlify , binascii.unhexlify internamente.

 private_key = "".join(["%02x" % ord(x) for x in os.urandom(32)])