Pull to refresh

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

Reading time3 min
Views19K
Если вы разрабатываете программы на Питоне, то, уверен, вы хорошо знакомы с работой с ним в интерактивном режиме. Это самый простой и удобный способ проверить пришедшую в голову идею, запустить библиотечную функцию, пошагово прогнать какой-то алгоритм и т.п. без создания лишних мусорных файлов. Вобщем питоновская консоль — очень мощная и удобная вещь. У меня постоянно напрашивается сравнение с юникс-шеллом в языке. Если бы не две ложки дегтя в этой бочке меда: команду каждый раз приходится набирать заново, вместо того, чтобы просто нажать стрелку вверх и подправить команду, а также приходится писать много лишнего, что только добавляет опечаток и необходимости повторного набора. Вобщем я хочу как в баше: история + автодополнение.
Я удивлен почему это еще не сделано по умолчанию. Кстати, очень может быть, что это уже реализовано в вашей системе, и вам это совершенно неактуально — тогда можете совершенно смело пропустить эту статью. Возможно это пригодится кому-то другому. На попавшихся мне 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

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

Способ честно подсмотрен на просторах интернета. Надеюсь, будет вам полезен.
Tags:
Hubs:
Total votes 50: ↑46 and ↓4+42
Comments34

Articles