apt как вывод столбца – библиотека python

Инструмент apt от Debian выводит результаты в одинаковые столбцы ширины. Например, попробуйте запустить «aptitude search svn» .. и все имена появятся в первом столбце той же ширины.

Теперь, если вы измените размер терминала, ширина столбца будет соответствующим образом скорректирована.

Есть ли библиотека Python, которая позволяет это сделать? Обратите внимание, что библиотека должна знать ширину терминала и принимать таблицу как входную информацию, которая может быть, например, [('rapidsvn', 'A GUI client for subversion'), ...] .. и вы можете также укажите максимальную ширину для первого столбца (или любого столбца). Также обратите внимание на то, как строка во втором столбце ниже обрезается, если превышает ширину терминала. Таким образом, не вводя нежелательную вторую строку.

 $ aptitude search svn [...] p python-svn-dbg - A(nother) Python interface to Subversion (d v python2.5-svn - v python2.6-svn - p rapidsvn - A GUI client for subversion p statsvn - SVN repository statistics p svn-arch-mirror - one-way mirroring from Subversion to Arch r p svn-autoreleasedeb - Automatically release/upload debian package p svn-buildpackage - helper programs to maintain Debian packages p svn-load - An enhanced import facility for Subversion p svn-workbench - A Workbench for Subversion p svnmailer - extensible Subversion commit notification t p websvn - interface for subversion repositories writt $ 

EDIT : (в ответ на ответ Алекса ниже) … результат будет похож на «поиск aptitude» в том, что 1) должен быть обрезан только последний столбец (который является единственным столбцом с самой длинной строкой в ​​строке) 2) обычно имеется только 2-4 столбца, но ожидается, что последний столбец («описание») займет не менее половины ширины терминала. 3) все строки содержат равное количество столбцов, 4) все записи являются только строками

4 Solutions collect form web for “apt как вывод столбца – библиотека python”

Я не думаю, что существует общий, кросс-платформенный способ «получить ширину терминала» – наиболее определенно НЕ «смотреть на переменную среды COLUMNS» (см. Мой комментарий к вопросу). В Linux и Mac OS X (и я ожидаю, что все современные версии Unix)

 curses.wrapper(lambda _: curses.tigetnum('cols')) 

возвращает количество столбцов; но я не знаю, поддерживает ли wcurses это в Windows.

Если у вас есть (из os.environ ['COLUMNS'], если вы настаиваете, или через проклятия, или от oracle, или по умолчанию до 80 или любой другой способ, который вам нравится), желаемая ширина выходного сигнала, остальное вполне возможно. Это фиктивная работа, у которой много шансов на случайные ошибки, и очень уязвим для множества подробных спецификаций, которые вы не делаете совершенно ясно, например: какой столбец разрезан, чтобы избежать обертывания – он всегда последний, или …? Как получилось, что вы показываете 3 столбца в примере вывода, когда по вашему вопросу передаются только два …? что должно произойти, если не все строки имеют одинаковое количество столбцов? должны ли все записи в таблице быть строками? и многие, многие другие тайны этого типа.

Итак, принимая несколько произвольных догадок для всех спецификаций, которые вы не выражаете, один подход может быть примерно таким:

 import sys def colprint(totwidth, table): numcols = max(len(row) for row in table) # ensure all rows have >= numcols columns, maybe empty padded = [row+numcols*('',) for row in table] # compute col widths, including separating space (except for last one) widths = [ 1 + max(len(x) for x in column) for column in zip(*padded)] widths[-1] -= 1 # drop or truncate columns from the right in order to fit while sum(widths) > totwidth: mustlose = sum(widths) - totwidth if widths[-1] <= mustlose: del widths[-1] else: widths[-1] -= mustlose break # and finally, the output phase! for row in padded: for w, i in zip(widths, row): sys.stdout.write('%*s' % (-w, i[:w])) sys.stdout.write('\n') 

Обновление . colprint подпрограмма colprint доступна в библиотеке Python, размещенной в GitHub .

Вот полная программа для тех, кто вас интересует:

 # This function was written by Alex Martelli # http://stackoverflow.com/questions/1396820/ def colprint(table, totwidth=None): """Print the table in terminal taking care of wrapping/alignment - `table`: A table of strings. Elements must not be `None` - `totwidth`: If None, console width is used """ if not table: return if totwidth is None: totwidth = find_console_width() totwidth -= 1 # for not printing an extra empty line on windows numcols = max(len(row) for row in table) # ensure all rows have >= numcols columns, maybe empty padded = [row+numcols*('',) for row in table] # compute col widths, including separating space (except for last one) widths = [ 1 + max(len(x) for x in column) for column in zip(*padded)] widths[-1] -= 1 # drop or truncate columns from the right in order to fit while sum(widths) > totwidth: mustlose = sum(widths) - totwidth if widths[-1] <= mustlose: del widths[-1] else: widths[-1] -= mustlose break # and finally, the output phase! for row in padded: print(''.join([u'%*s' % (-w, i[:w]) for w, i in zip(widths, row)])) def find_console_width(): if sys.platform.startswith('win'): return _find_windows_console_width() else: return _find_unix_console_width() def _find_unix_console_width(): """Return the width of the Unix terminal If `stdout` is not a real terminal, return the default value (80) """ import termios, fcntl, struct, sys # fcntl.ioctl will fail if stdout is not a tty if not sys.stdout.isatty(): return 80 s = struct.pack("HHHH", 0, 0, 0, 0) fd_stdout = sys.stdout.fileno() size = fcntl.ioctl(fd_stdout, termios.TIOCGWINSZ, s) height, width = struct.unpack("HHHH", size)[:2] return width def _find_windows_console_width(): """Return the width of the Windows console If the width cannot be determined, return the default value (80) """ # http://code.activestate.com/recipes/440694/ from ctypes import windll, create_string_buffer STDIN, STDOUT, STDERR = -10, -11, -12 h = windll.kernel32.GetStdHandle(STDERR) csbi = create_string_buffer(22) res = windll.kernel32.GetConsoleScreenBufferInfo(h, csbi) if res: import struct (bufx, bufy, curx, cury, wattr, left, top, right, bottom, maxx, maxy) = struct.unpack("hhhhHhhhhhh", csbi.raw) sizex = right - left + 1 sizey = bottom - top + 1 else: sizex, sizey = 80, 25 return sizex 

Ну, aptitude использует cwidget для форматирования столбцов в текстовом дисплее. Вы можете позвонить в cwidget написав для него расширение python, но я не думаю, что это стоит того … Вы можете использовать свой предпочтительный метод получения фактического горизонтального размера в символах и рассчитать себя.

Во-первых, используйте ioctl чтобы получить размер TTY:

 import termios, fcntl, struct, sys def get_tty_size(): s = struct.pack("HHHH", 0, 0, 0, 0) fd_stdout = sys.stdout.fileno() size = fcntl.ioctl(fd_stdout, termios.TIOCGWINSZ, s) return struct.unpack("HHHH", size)[:2] print get_tty_size() 

Затем для создания столбцов используйте такую ​​функцию:

 pad = lambda s, n=20: "%s%s" % (s,' '*(n-len(s))) 

Поместите их вместе, и у вас есть изменения размеров столбцов для консоли!

Python - лучший язык программирования в мире.