открытие другого процесса python 3 из подпроцесса. Открытое значение устанавливает кодировку по умолчанию для ANSI_X3.4-1968, но только в определенных случаях

1

Это сводит меня с ума. У меня есть основной драйвер/программа 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.

Какие-нибудь предложения о том, что происходит?

Благодарю.

  • 0
    Вы можете передать кодировку при открытии logfile ...
  • 1
    изменил попен на попен (извините, Жан-Франсуа Фабр)
Показать ещё 3 комментария
Теги:
python-3.x
utf-8
encoding
subprocess

1 ответ

0

ОП здесь, я думаю, что нашел решение, но я до сих пор не знаю, зачем мне это делать только для этого конкретного 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 в моем подпроцессе, и все работает.

Может ли кто-нибудь объяснить это мне? Мне не нужно делать это с моим другим подпроцессом, и все работает отлично.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню