Это сводит меня с ума. У меня есть основной драйвер/программа python 3 (3.5.2), в которой я использую подпроцесс и popen для создания дополнительных процессов python 3, с которыми я общаюсь с использованием rpyc. Это работает хорошо, особенно в python 2.
Я успешно конвертировал в python 3 и проверил, что все эти процессы появляются успешно, если они запускаются с терминала.
Чтобы запустить их у моего драйвера, это выглядит так.
cmd_one = "/path/to/.virtualenv/venv_one/bin/python file_a.py"
cmd_two = "/path/to/.virtualenv/venv_two/bin/python file_b.py"
s_one = subprocess.Popen(cmd_one.split(), stdout=logfile, stderr=logfile)
s_two = subprocess.Popen(cmd_two.split(), stdtou=logfile, stderr=logfile)
Это отлично работало в Python 2.7.
Однако, когда я обновляюсь до Python 3, я вижу что-то странное с кодировкой по умолчанию, которую я не могу понять. Для cmd_one он работает great--, если я делаю
import locale
print(locale.getpreferredencoding())
он возвращает UTF-8
как я ожидал. Однако для cmd_two я получаю ANSI_X3.4-1968
по какой-то причине, и в результате он бросает в лодку ошибки unicodedecode. Как я уже сказал, при создании в терминале cmd_one и cmd_two отлично работают и используют правильную кодировку по умолчанию.
Я искал экстенсивно, но это, кажется, особый случай. Я не хочу принуждать кодировку по умолчанию, потому что я чувствую, что это маскирует некоторые другие проблемы. Есть ли что-то в file_b.py
и его составляющих, которые каким-то образом устанавливают кодировку в ANSII, когда она не видит, что она запускается в терминале? file_b.py
является частью большого проекта Tensorflow, и на нем есть около 8 файлов, но я просмотрел их все, но ничего не могу найти.
Это на ubuntu 16.04
а по умолчанию python 3 - 3.5.2, и, насколько я знаю, нет способа передать encoding='utf-8'
с помощью Popen.
Какие-нибудь предложения о том, что происходит?
Благодарю.
ОП здесь, я думаю, что нашел решение, но я до сих пор не знаю, зачем мне это делать только для этого конкретного instance--, надеюсь, кто-то может взвесить, чтобы я мог понять это лучше.
От:
https://webkul.com/blog/setup-locale-python3/
Когда я запускаю:
locale
в моем терминале и в качестве подпроцесса я получаю:
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
Для меня была установлена стандартная кодировка, чтобы установить en_US.en
среду LANGUAGE
в en_US.en
и LC_ALL
в переменные en_US.UTF-8
и передать их непосредственно в подпроцесс с помощью Popen.
s = subprocess.Popen(cmd_two.split(), env={'LANGUAGE':'en_US.en', 'LC_ALL':'en_US.UTF-8'})
Теперь он правильно идентифицирует кодировку по умолчанию как UTF-8
в моем подпроцессе, и все работает.
Может ли кто-нибудь объяснить это мне? Мне не нужно делать это с моим другим подпроцессом, и все работает отлично.
logfile
...