0
0 комментариев

Из php вызывал bash-скрипт, и все было хорошо

ob_implicit_flush(true);
    ob_end_flush();
    system ("sudo /path/start.sh $name_user 2>&1");

Скрипт выполнялся на стороне сервера без проблем, но долго.

Переписал его на python’e, скрипт из консоли отлично работает и отображает русские буквы.

Но если его вызывать из php:

header( "Content-Type: text/html; charset=utf-8" );
<code>
ob_implicit_flush(true);
ob_end_flush();
echo "<pre>";
system ("sudo /path/start.py $name_user 2>&1");

То вываливается ошибка:

Traceback (most recent call last):
File «/path/start.py», line 250, in
print («\u041f\u043e\u0435\u0445\u0430\u043b\u0438 )»)
UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 0-6: ordinal not in range(128)

Ошибка напервом встречающемся принте с русскими символами.

В баш скрипте, в начале, прописывал принудительно, что локаль UTF, так как не смотря на header переменные идут не как планировалось, но тут ошибка даже до переменных. Даже если все передаваемые переменные приводить к латинским символам, ругается именно на русские слова в самом скрипте.

Как поступить и как указать принудительно кодировку?

Скрипт пробовал на python2 с # —— coding: utf —— (# —— coding: utf-8 —-)

Так же взял python3, который с русскими буквами уже нормально, все равно проблема остается. При этом из консоли все отлично работает.

Конечно, есть желаение переписать весь php на python, но тем не менее, вопрос остается и проблема пока не решилась.

Как быть?

Добавлено позднее:

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

но добавил PYTHONIOENCODING в глобальное окружение /etc/profile

export PYTHONIOENCODING="UTF-8"

Сам файл сделал с таким содержанием

#!/usr/bin/env python3.4
# -*- coding: utf -*-
 
import os
 
#print("Русский текст весь")
print(os.environ['PYTHONIOENCODING'])

При вызове из php

system ("sudo /path/start.py 2>&1");

Ошибка

Traceback (most recent call last): File "/etc/openvpn/easy-rsa/easyrsa3/vpn.py", line 7, in print(os.environ['PYTHONIOENCODING']) File "/usr/lib64/python3.4/os.py", line 633, in getitem raise KeyError(key) from None KeyError: 'PYTHONIOENCODING'

Тот же результат если

system ("PYTHONIOENCODING=utf-8 && sudo /path/start.py 2>&1");

Это третий питон, а если второй питон, то проблем с русскими буквами теперь нет.

Получается, как и писали выше, что питон3 берет свою кодировку, но при ятном указании utf-8 все равно не использует ее?

Добавлено:

Так же попробовал такой код

envname = "PYTHONIOENCODING"
print("{}:\t{}".format(envname, os.environ.get(envname)))
 
for set_locale in [False]:
    print("locale({}):\t{}".format(set_locale,
                                               locale.getpreferredencoding(set_locale)))
 
for streamname in "stdout stderr stdin".split():
    stream = getattr(sys, streamname)
    print("device({}):\t{}".format(streamname,
                               os.device_encoding(stream.fileno())))
    print("{}.encoding:\t{}".format(streamname, stream.encoding))
 
for set_locale in [False, True]:
    print("locale({}):\t{}".format(set_locale,
                                           locale.getpreferredencoding(set_locale)))

вывод в консоли получил

PYTHONIOENCODING:   UTF-8
locale(False):  UTF-8
device(stdout): UTF-8
stdout.encoding:    UTF-8
device(stderr): UTF-8
stderr.encoding:    UTF-8
device(stdin):  UTF-8
stdin.encoding: UTF-8
locale(False):  UTF-8
locale(True):   UTF-8
Поехали )

А избраузера

PYTHONIOENCODING:   None
locale(False):  ANSI_X3.4-1968
device(stdout): None
stdout.encoding:    ANSI_X3.4-1968
device(stderr): None
stderr.encoding:    ANSI_X3.4-1968
device(stdin):  None
stdin.encoding: ANSI_X3.4-1968
locale(False):  ANSI_X3.4-1968
locale(True):   ANSI_X3.4-1968
Traceback (most recent call last):
  File "/etc/openvpn/easy-rsa/easyrsa3/vpn.py", line 261, in
    print ("\u041f\u043e\u0435\u0445\u0430\u043b\u0438 )")
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-6: ordinal not in range(128)

То есть Кодировка ни как не передается

Попробовал добавить

sys.stdout.buffer.write((" Русский ").encode('utf8'))

И в браузере ошибки нет и русский текст появиллся… но не писать же там для каждого встречающегося предолжения?


Добавить комментарий