LINUX.ORG.RU

python3 subprocess.Popen не принимает кириллицу


0

1

python 3.2, linux

запускаю питон в консоли, выполняю

subprocess.Popen('grep «тест» log.txt', shell=True,stdout=subprocess.PIPE, stdin=subprocess.PIPE)

всё работает

запускаю скрипт как cgi через apache и получаю

as_hlp.py", line 206, in execute stdout=device, stdin=subprocess.PIPE) File «/usr/local/lib/python3.2/subprocess.py», line 736, in __init__ restore_signals, start_new_session) File «/usr/local/lib/python3.2/subprocess.py», line 1175, in _execute_child restore_signals, start_new_session, preexec_fn) UnicodeEncodeError: 'ascii' codec can't encode characters in position 26-28: ordinal not in range(128)

вообще, если я пытаюсь вывести принтом кириллицу на страницу, ошибки такие же
тогда я делаю так:

[code=python]
def _print(text):
sys.stdout.buffer.write(text.encode('utf8'))
sys.stdout.flush()
[/code]

но subprocess.Popen не принимает байты
если ему их передать, отвечает:

line 1175, in _execute_child restore_signals, start_new_session, preexec_fn) TypeError: Can't convert 'int' object to str implicitly


Что делать? Я не понимаю как тогда передать ему правильный утф-8 с кириллицей?
Пробовал декодировать и потом снова енкодировать в утф-8 - не помогает

PIPE? Сдается мне, ты чего-то недоговариваешь.

baverman ★★★
()
[#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import subprocess
subprocess.Popen('grep "тест" log.txt', shell=True,stdout=subprocess.PIPE, stdin=subprocess.PIPE)

?

Deleted
()
Ответ на: комментарий от true_admin

Для py3k указание кодировки не нужно.

Хм... Буду знать.

Deleted
()

Покажи минимальный cgi целиком. Что-то как-то всё мутно с учётом того что у тебя в строка «тест» короче 28 символов.

true_admin ★★★★★
()

Может вот так попробовать? - subprocess.Popen(u'grep «тест» log.txt', shell=True,stdout=subprocess.PIPE, stdin=subprocess.PIPE)

pi11 ★★★★★
()
Ответ на: комментарий от baverman

спасибо, но нет
та же ошибка, не говоря о том что выдача subprocess.Popen не попадает в переменную

sergey-novikov ★★★
() автор топика
Ответ на: комментарий от Deleted

попробовал вот так:

command = «export LC_ALL=ru_RU.UTF-8 && export LANG=ru_RU.UTF-8 && grep --binary-files=text \»%s\" %s"

proc = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE)

не помогло

sergey-novikov ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.