LINUX.ORG.RU

[Python] загадочные символы в stdout при импорте readline?

 


0

1

Заметил, что на некоторых дистрах линукса (в частности на SuSE11 с чем то там) при вызове

import readline

в stdout вылетает последовательность ^[[?1034h (во всяком случае так она отображается в vi). Под дебианом 6.0 такого нету. Python 2.6

Как бы это дело побороть? Мешает, gnuplot в частности такое не ест.

★★★★★

Если не вдаваться в причины, то можно попробовать так:
import sys
stdout = sys.stdout
sys.stdout = open('/dev/null', 'w')
import readline
sys.stdout = stdout

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

Пробовал, конечно не работает. sys.stdout чисто питоновское представление stdout, readline про него нифига не знает. Нужно делать что то вроде os.dup2, но вот как потом назад вернуть?

AIv ★★★★★
() автор топика
Ответ на: комментарий от Rzhepish

А вот нефига. Т.е. в интерпретаторе работает, а из скрипта нет

 
$ cat > ~/tmp/test.py 
import os; os.dup2(1,10); os.close(1); import readline; print "garbage"; os.dup2(10,1); os.close(10); print "k" 
$ python ~/tmp/test.p 
garbage 
k 
$ python ~/tmp/test.py | less 
ESC[?1034hgarbage 
k 
AIv ★★★★★
() автор топика

Это бага, сейчас найду ссылку. Обойти можно, выставив терминал:

~$ python -c 'import readline' | hexdump -C
00000000  1b 5b 3f 31 30 33 34 68                           |.[?1034h|
00000008
~$ TERM=linux python -c 'import readline' | hexdump -C
~$
baverman ★★★
()
Ответ на: ugly hack от Rzhepish

Однако... работает. Спасибо!;-)

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

тьфу, туплю, его ж можно назад после импорта откатить

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

Все, спасибо большое, проблема решена.

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

http://old.nabble.com/-PATCH-:-fix-libreadline5-linked-applications-sending-m...

https://bugzilla.novell.com/show_bug.cgi?id=503121

Кстати, там по ссылке есть более мудрое решение:

if sys.stdout.isatty():
       import readline

Это если readline импортим мы. Если сторонняя либа, то можно оборачивать в

oldterm = os.environ['TERM']
os.environ['TERM'] = 'linux'
import lib
os.environ['TERM'] = oldterm
baverman ★★★
()
Ответ на: комментарий от baverman

Да, я заюзал второе решение (тока еще del oldterm).

Хотя с isatty более Ъ, но там придется еще все потроха с readline связанные отключать...

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