Бросьте меньше с Pexpect

У меня есть 3 файла: a.py, b.sh и text.txt. Их содержание следующее:

a.py:

#!/usr/bin/env python
import os, pexpect

class zz:
    def __init__(self):
        child = pexpect.spawn ('/home/usr/Desktop/b.sh')

        ###  VVV     LINE IN QUESTION BELOW    VVV
        child.expect(pexpect.EOF)

        child.sendline('q')
        child.interact()

z = zz()

b.sh:

less /home/usr/Desktop/text.txt
echo 'all done'
sleep 3

текст.txt:

thisistext

Файлы text.txt и b.sh доступны только для чтения и не должны изменяться. Как выйти из less, используя pexpect изнутри a.py?


person mh00h    schedule 25.06.2013    source источник
comment
у вас есть bc.sh в строке spawn. Это как задумано? Удачи.   -  person shellter    schedule 25.06.2013
comment
Нет, это была ошибка при копировании в stackoverflow. Спасибо что подметил это.   -  person mh00h    schedule 25.06.2013
comment
Здесь трудно определить свою цель. Кажется, вы могли бы просто использовать cat .../text.txt. Если вы хотите, чтобы пользователь мог пользоваться интерактивными функциями less, то как/почему следует задействовать pexpect? Существует опция less, которая будет отображать и закрывать файл (я думаю), или, если нет, другая командная строка выбирает меньше или LESS envvar может вам помочь. Удачи.   -  person shellter    schedule 26.06.2013
comment
b.sh доступен только для чтения - он подлежит обновлениям, поэтому я не могу изменить в нем команду less из-за внешнего обновленного сценария b.sh, который все время перезаписывает мой патч. Если бы я мог, я бы вообще удалил less.   -  person mh00h    schedule 26.06.2013


Ответы (1)


Предполагая, что вы не хотите ничего делать с данными, просто прочитайте первый экран данных из less, а затем введите «q».

(EDIT: это потребовало настройки, чтобы дать «чтение» размера, чтобы он не ждал размера по умолчанию или eof)

#!/usr/bin/env python
import os, pexpect

class zz:
    def __init__(self):
        child = pexpect.spawn ('/home/usr/Desktop/b.sh')
        # grab the first screen from 'less'
        child.read(1)
        child.send('q')

z = zz()

Вот код, который я использовал для теста:

~/tmp/reader$ cat a.py
#!/usr/bin/env python
import pexpect

try:
    open('status.txt', 'w')
    child = pexpect.spawn('/bin/sh "./b.sh"', timeout=10)
    child.send('q')
    child.expect(pexpect.EOF)
except Exception,e:
    print 'exception'
print open('status.txt').read()


~/tmp/reader$ cat text.txt
iamtext

~/tmp/reader$ cat b.sh
#!/bin/sh
less text.txt
echo 'all done'
sleep 3
date > status.txt
person tdelaney    schedule 25.06.2013
comment
Это не работает. Если я скажу b.sh коснуться run.txt в последней строке, файл не будет создан, если используется child.read(). - person mh00h; 26.06.2013
comment
@mh00h - я был удивлен! Я протестировал pexpect напрямую с less и просто предположил, что он будет работать через команду оболочки. В любом случае, я думаю, что это сработает, если вы включите размер в вызов чтения. Я разместил тест, который я использовал. - person tdelaney; 26.06.2013