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

Это сводит меня с ума.У меня есть основной драйвер / программа Python 3 (3.5.2), который я использую и использую подпроцесс для вызова дополнительных процессов 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 это прекрасно работает - если я сделаю

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.

Любые предложения о том, что, черт возьми, происходит?

Спасибо.

1 Ответ

0 голосов
/ 19 сентября 2018

ОП здесь, я думаю, что я нашел решение, но я все еще не знаю, почему мне нужно делать это только для этого конкретного случая - надеюсь, кто-то может взвесить, чтобы я мог понять это лучше.

От:

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=

Что исправило для меня кодировку по умолчанию, так это то, что я установил переменные окружения 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 в моем подпроцессе, и все работает.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...