Подтвердить что ты не робот

Python - Как вы просматриваете вывод, который не соответствует экрану?

Я должен сказать, что я ищу решение проблемы просмотра, который не подходит на вашем экране. Например, диапазон (100) покажет последние 30ish строк в вашем терминале 30 высоты.

Я только ищу, чтобы меня подтолкнули в правильном направлении, и мне любопытно, как вы, ребята, подошли к этой проблеме.

Что вы сделали, когда столкнулись с ситуацией, когда хотите, чтобы вы могли удобно прокручивать какой-то большой выход?

Лучший ответ

Используйте буфер прокрутки на вашем терминале.

Если вы используете GNU Screen, его можно установить с помощью defscrollback 1000 или любого другого номера в HOME/.screenrc.

Используйте Ctrl-a, [ для входа в режим копирования

j -    Move the cursor down by one line
k -    Move the cursor up by one line
C-u -  Scrolls a half page up.
C-b -  Scrolls a full page up.
C-d -  Scrolls a half page down.
C-f -  Scrolls the full page down.
G -    Moves to the specified line 

Лучшая часть ? для обратного поиска, / для прямого поиска в режиме копирования.

Супер удобно.

Спасибо!


Оригинальный вопрос:

Что такое эквивалент python команды bash less?

LongString | less 

Есть ли что-то подобное для python? Я считаю, что могу использовать его довольно часто, но просто двигаюсь дальше и находим другое решение.

Под "длинными вещами" я подразумеваю все, что генерирует больше выходных строк, чем мой экран. 1000 печатных сообщений, словарь, большая строка, диапазон (1000) и т.д.

Мой googlefu не удался.

4b9b3361

Ответ 1

Если вы хотите сделать это для интерактивного сеанса python, вы должны использовать эмуляцию терминала, которая позволяет вам выполнять резервное копирование. Я считаю, что большинство из них это делает.

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

(Если вы используете Windows, вы можете изменить размер буфера экрана, чтобы разрешить прокрутку до 9999 строк).

И если вам нужно это для вывода вашей программы, вы можете попытаться использовать модуль curses, чтобы реализовать прокрутку.

Ответ 2

просто для удовольствия: o)

Оригинальная версия для Python2:

class Less(object):
    def __init__(self, num_lines):
        self.num_lines = num_lines
    def __ror__(self, other):
        s = str(other).split("\n")
        for i in range(0, len(s), self.num_lines):
            print "\n".join(s[i: i + self.num_lines])
            raw_input("Press <Enter> for more")

less = Less(num_lines=30)  
"\n".join(map(str, range(100))) | less

версия Python3:

class Less(object):
    def __init__(self, num_lines):
        self.num_lines = num_lines
    def __ror__(self, other):
        s = str(other).split("\n")
        for i in range(0, len(s), self.num_lines):
            print(*s[i: i + self.num_lines], sep="\n")
            input("Press <Enter> for more")

less = Less(num_lines=30)  
"\n".join(map(str, range(100))) | less

Ответ 3

Да, есть способ, и это довольно тривиально, поэтому почему конкретно не описано. Скажем, у вас длинный список и вы хотите увидеть только начало:

>>> lst = range(1000)   # let make list of thousand elements
>>> lst[:100]           # i want to see just the first 100
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
>>> lst[100:201]        # ok, now the 2nd hundred 
[100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200]
>>> lst[-100:]          # and now just the last 100, pretty please?
[900, 901, 902, 903, 904, 905, 906, 907, 908, 909, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 930, 931, 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, 975, 976, 977, 978, 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, 999]

То же самое для [] slicing работает для строк. Для словаря вы можете как-то обмануть, например, используя str(), чтобы преобразовать его в строку, а затем отобразить с тем же разрезом: -)

Ответ 4

Если вы работаете в ipython, вы можете выпустить команды оболочки в своем интерактивном сеансе python. Это означает, что вы просто делаете

In [1]: less myfile.txt

Мне также очень нравится возможность стрелки вверх и вниз, чтобы получить предыдущие команды и получить вывод из предыдущих команд, сделав что-то вроде

In [33]: print cos(Out[7]*pi/180)

Ответ 5

Есть одно фундаментальное отличие между меньшим запуском в оболочке и Python: Python - это язык программирования, меньше - программа.

Bash знает, что linecount находится в консоли, и меньше может запросить это (и ряд других вещей), Python сам по себе не может быть, это язык и он не зависит от его среды ( которые оставлены библиотекам).

Кроме того, меньше подчиняется некоторым своим стандартам. Затрагиваемые строки перемещаются вверх, он передает termcap, он концептуально является частью инструментов ОС и предназначен для отправки на вывод, даже если он еще не закончил чтение файла.

Вы можете писать меньше на Python, если хотите, или запускать его из python script, но его функциональность больше (и слишком специфична), чем должен содержать один метод файла.

Ответ 6

Если ваши данные json serilizable, вы можете попробовать

import simplejson
print simplejson.dumps({'shipping-line': {'price': '0.00', 'code': 'Local Pickup (Portland, OR)', 'title': 'Local Pickup (Portland, OR)'}}, indent=4)

Результат будет выглядеть примерно так:

{
    "shipping-line": {
        "price": "0.00", 
        "code": "Local Pickup (Portland, OR)", 
        "title": "Local Pickup (Portland, OR)"
    }
}

это специально используется для отладки и просмотра фактического содержимого...... в хорошо читаемом формате..

EDIT:

если ваш экран ограничен 25 строками..........

import simplejson
data = simplejson.dumps({'shipping-line': {'price': '0.00', 'code': 'Local Pickup (Portland, OR)', 'title': 'Local Pickup (Portland, OR)'}}, indent=4)

cnt = 0

for line in data.split('\n'):
    cnt+=1
    print line
    raw_input() if cnt%25==0 else None

Ответ 7

Предположим, вы пишете программу на Python, и все, что она делает, довольно печатает некоторые вещи. Выходной сигнал находится в prettiest_print_ever. Вы уже делаете странные трюки, импортируя fcntl, termios, struct и друзей, чтобы получить размер терминала, чтобы вы могли использовать полную ширину терминала (если есть); что также дает вам высоту экрана, поэтому имеет смысл использовать его. (Это также означает, что вы давно отказались от каких-либо претензий на кросс-платформенную совместимость.)

Конечно, вы можете изобрести колесо, или можете полагаться на меньшее, как это делают другие программы (например, git diff). Это должно быть контур решения:

def smart_print(prettiest_print_ever, terminal_height = 80):
  if len(prettiest_print_ever.splitlines()) <= terminal_height:
    #Python 3: make sure you write bytes!
    sys.stdout.buffer.write(prettiest_print_ever.encode("utf-8"))
  else
    less = subprocess.Popen("less", stdin=subprocess.PIPE)
    less.stdin.write(prettiest_print_ever.encode("utf-8"))
    less.stdin.close()
    less.wait()

Ответ 8

Легко написать свой собственный:

def less(s, line_count = 5):
    lines = []
    for i, line in enumerate(s.split('\n'), 1):
        lines.append(line)
        if (i % line_count) == 0:
            yield '\n'.join(lines)
            lines = []

    if lines:
        yield '\n'.join(lines)

Ответ 9

Что вы сделали, когда столкнулись с ситуацией, когда вы могли бы удобно > прокрутить какой-то большой выход?

  • Не создавайте большой вывод. Используйте функции для суммирования или отображения выбранных деталей.

  • Упростите приложение, чтобы избежать создания большого вывода в первую очередь.

  • Сосредоточьтесь на том, что я ищу, чтобы избежать большого выхода.

  • Вообще-то избегайте большого выхода.

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