Консольные хитрости Питон: история команд + автодополнение

    Если вы разрабатываете программы на Питоне, то, уверен, вы хорошо знакомы с работой с ним в интерактивном режиме. Это самый простой и удобный способ проверить пришедшую в голову идею, запустить библиотечную функцию, пошагово прогнать какой-то алгоритм и т.п. без создания лишних мусорных файлов. Вобщем питоновская консоль — очень мощная и удобная вещь. У меня постоянно напрашивается сравнение с юникс-шеллом в языке. Если бы не две ложки дегтя в этой бочке меда: команду каждый раз приходится набирать заново, вместо того, чтобы просто нажать стрелку вверх и подправить команду, а также приходится писать много лишнего, что только добавляет опечаток и необходимости повторного набора. Вобщем я хочу как в баше: история + автодополнение.
    Я удивлен почему это еще не сделано по умолчанию. Кстати, очень может быть, что это уже реализовано в вашей системе, и вам это совершенно неактуально — тогда можете совершенно смело пропустить эту статью. Возможно это пригодится кому-то другому. На попавшихся мне Macos, Freebsd, Debian и Fedora этого не было.



    Для этого нужно создать где-то в недрах файловой системы файл initialize.py такого содержания:

    import sys, os, readline

    histfile = os.path.join(os.environ["HOME"], ".pyhist")
    try:
      readline.read_history_file(histfile)
    except IOError:
      pass
    import atexit
    atexit.register(readline.write_history_file, histfile)
    del os, histfile

    try:
      import readline
    except ImportError:
      print "Module readline not available."
    else:
      import rlcompleter
      readline.parse_and_bind("tab: complete")


    * This source code was highlighted with Source Code Highlighter.


    Я предпочитаю такие файлы закидывать в ~/bin/.
    А дальше при каждом запуске вначале выполняете этот скрипт. Конечно, это не надо делать руками — если вы используете bash в качестве оболочки, то просто добавьте в .bashrc строку:
    export PYTHONSTARTUP=$HOME/bin/initialize.py


    Теперь работа с консолью питона станет не просто кайфом, а сплошным кайфом. Вызываем оболочку:

    $ python
    Python 2.5.2 (r252:60911, May 28 2008, 08:35:32)
    Type "help", "copyright", "credits" or "license" for more information.
    >>> from UserDict import UserDict



    Самой собой история команд поначалу пуста — поэтому стрелку вверх жать не надо.
    Создаем какой-нибудь объект — я для примера взял UserDict. После того как он импортирован начните набирать команду и нажмите <Tab>
    >>> u=User        # здесь нажат <Tab><Tab>
    UserDict   UserWarning 
    >>> u=UserDict()

    # посмотрим какие у него есть поля и методы:
    >>> u.        # снова <tab><tab>
    u.__class__   u.__delitem__  u.__init__   u.__repr__   u.copy     u.get      u.iteritems   u.keys     u.setdefault  
    u.__cmp__    u.__doc__    u.__len__    u.__setitem__  u.data     u.has_key    u.iterkeys   u.pop      u.update    
    u.__contains__ u.__getitem__  u.__module__  u.clear     u.fromkeys   u.items     u.itervalues  u.popitem    u.values    
    >>> u.


    * This source code was highlighted with Source Code Highlighter.


    После выхода из интерпретатора вся история команд будет записана в файл ~/.pyhist, и запустив консоль заново, мы можете легко повторить действия, которые делали в прошлый раз.

    Очень может быть, что с первого раза у вас не заработает. Скорее всего дело в том, что не установлен модуль python-readline — именно так было у меня. На дебиане ставится элементарно:
    apt-get install python-readline

    Для других дистрибутивов — см. инструкцию к своему дистру.

    Способ честно подсмотрен на просторах интернета. Надеюсь, будет вам полезен.
    Метки:
    Поделиться публикацией
    Реклама помогает поддерживать и развивать наши сервисы

    Подробнее
    Реклама
    Комментарии 34
    • 0
      Ещё readline можно установить с PyPI через easy_install, zc.buildout или вообще скачав tar.gz и запустив setup.py install :-)
      • +3
        Самой собой — способов масса.
        Я выбрал максимально системный, чтобы в будущем с этим не морочиться, а перегрузить заботы об обнвлении и поддержании зависимостей на систему :)
      • 0
        Полезно, спасибо!
        • +14
          Попробуйте ipython, будете ещё больше удивлены.
          • +2
            только хотел написать :-) IPython — это крышеснос тотального уровня :-)
          • НЛО прилетело и опубликовало эту надпись здесь
            • 0
              Да, этот момент импорта немного странноват.

              Очистка модулей? Не очень понял Вас. Вы имели ввиду перезагрузку модуля (reload) или что-то другое?
              • НЛО прилетело и опубликовало эту надпись здесь
            • 0
              Перенесите пожалуйста в блог Python
            • 0
              отлично, спасибо
              мне именно этого не хватало в питонской консоли, теперь шоколадно
              • 0
                Сделал, как написано. Сохранение истории работает, дополнение по табу нет. Все модули импортируются. Комманды проходят без ошибок. Что я делаю не так? (Mac OS X 10.5.5, Python 2.5.1)
                • 0
                  Все модули перечисленные в скрипте нормально загрузились?
                  • 0
                    Да. Никаких ошибок нет. Пробовал пускать этот скрипт из оболочки. Таб всё равно не работает. Точнее работает, но как таб, а не автодополнение.
                    • 0
                      а rlcompleter установлен?
                      • 0
                        Python 2.5.1 (r251:54863, Apr 15 2008, 22:57:26)
                        [GCC 4.0.1 (Apple Inc. build 5465)] on darwin
                        Type «help», «copyright», «credits» or «license» for more information.
                        >>> import rlcompleter
                        >>>

                        Если вы про это.
                        • +1
                          Странно. К сожалению, ничего конкретного про мак сказать не могу. Не исключено, что там кнопка Tab переопределена консолью и обработка просто не доходит до скрипта. Как например, это происходит с PgAdmin-ом: F5 должна запускать запрос, но вместо этого увеличивается громкость системного динамика. Попробуйте задать в скрипте другую кнопку или проконсультироваться у маководов.
                          • 0
                            Попробую. Спасибо за участие.
                • 0
                  ipython?
                  • НЛО прилетело и опубликовало эту надпись здесь
                    • +1
                      аналогично в арче.
                      история в стандартном питоне уже есть, наверное просто у кого то старый питон.
                      как уже рекомендовали выше, крайне удобно использовать ipython ( ipython.scipy.org/moin/ )
                      В нем есть автоотступы, и история не просто команд, а целых классов и функций и куча фишек, о которых можно узнать на офф сайте.
                      • 0
                        $ python -V
                        Python 2.5.2
                        почему-то не было ни истории и автодополнения.
                        Вообще найденному рецепту уже несколько лет — поэтому удивительно почему это не встроили по умолчанию. Как я говорил выше, в каких-то дистрах это уже пристутствует, но пока не везде.

                        Посмотрю на ipython.
                        • 0
                          Да, точно помню, что в gentoo история команд в консоли Питона была точно… Даже удивился, когда пост увидел. Но в Питоне из MacPorts история не работает, как оказалось. Спасибо за рецепт.
                          • 0
                            История есть, но она не сохраняется между сессиями, как сделано в этом скрипте
                            • +1
                              В MacPorts есть пакет py-readline. После установки история появляется автоматически.
                        • 0
                          Спасибо. Не знал про таковой. Пользовался обычным python + рецепт аналогичный выше процитированному.
                        • 0
                          Вот это да! Как раз то, чего мне так не хватало! Спасибо!
                          • 0
                            Поставьте уже ipython. Будете иметь и это, и многое другое.
                            • 0
                              Спасибо — обязательно поставлю и посмотрю :)
                              • 0
                                Хочу большой пост про IPython! Только что поставил, никак не соображу, для чего б его поюзать.
                                • 0
                                  Очень хорошие видео-туториалы по ipython можно посмотреть на showmedo.com
                              • +2
                                Поскольку используется libreadline, можно пользоваться всеми (практически) его фишками.

                                Например, поиск в истории по шаблону: нажимаем Ctrl+R и набираем фрагмент строки, которую хотим найти. Alt+Shift+< для перехода к первой записи в истории команд. Alt+Shift+> для перехода к последней.

                                Ну, и так далее.
                                • 0
                                  Спасибо, действительно, не хватало.

                                  Кстати, и стандартная консоль Python'a, и IPython не автокомлитят объекты, если они заданы явно, а не через переменную (например, просто строка — 'abc'. жмешь Таb — вылезает системный автокомплит вместо методов строки (если написать a = 'abc' и потом a. Tab — все нормально); в стандартном IDLE данная фича работает)

                                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.