Напечатанная python переменная не равна значению переменной - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть скрипт python, который вызывает функцию php с использованием подпроцесса. Вывод сценария php записывается в качестве переменной для дальнейшего использования. Анализируя сохраненную переменную, я обнаружил, что если я распечатываю переменную, она имеет значение, отличное от самой переменной, и я не могу понять, почему. Я готовлюсь быть смущенным, поэтому, пожалуйста, просветите меня.

Да, пароль в этом вымышленном примере - «пароль»

cmd = "/usr/bin/php -f /opt/hello_world.php {} {}".format(encrypted_password,of_secret)
decrypted_password = subprocess.getoutput(cmd)
print(decrypted_password)
pdb.set_trace()

в pdb здесь вывод

password
(Pdb) decrypted_password
'\x00p\x00a\x00s\x00s\x00w\x00o\x00r\x00d'
(Pdb) print(decrypted_password)
password
(Pdb) locals()
{'cmd': '/usr/bin/php -f /opt/hello_world.php f2e57ba074b3c3d8d4d010bcff13083dc5928107f8cfbfaa4a52fff0155eebe5 JqiRnKJBaSwEOCI', 'decrypted_password': '\x00p\x00a\x00s\x00s\x00w\x00o\x00r\x00d'}

1 Ответ

2 голосов
/ 29 апреля 2020

subprocess.get_output() возвращает байтовую строку, но Python распознает ее как строку. Поэтому вам нужно сначала .encode() это, а затем decode() it:

>>> '\x00p\x00a\x00s\x00s\x00w\x00o\x00r\x00d'.encode().decode('utf_16_be')
'password'

Кодируется в UTF-16 BE, который дает два байта каждому символу, следовательно, \x00 для нуля ,

Возможно, вы сможете настроить язык или иным образом манипулировать кодировкой для правильного распознавания строки.

...