IPython: замена стандартного Python shell

    Python shell достаточно удобная вещь для тестирования и изучения возможностей языка, кто-то даже использует его в качестве калькулятора(что между прочим весьма удобно), в этом цикле статей я бы хотел рассказать о IPython — замене стандартного Python shell'а, который предоставляет расширенный список возможностей, что делает работу с ним более эффективной.


    Скачать и установить IPython можно с официального сайта

    Пространство имен


    Запускаем IPython shell командой 'ipython', как и в в стандартном Python shell'е мы можем присваивать переменным значения:
    In [1]: msgflag = 1

    In [2]: pi = 3

    In [3]: msg = "hello"

    In [4]: warning = None

    Во время ввода можно пользоваться автокомплитом, например набрав msg и нажав Tab, мы получим возможные варианты:
    In [5]: msg
    msg msgflag

    Если вариант один, то он автоматически появится в поле ввода.

    IPython предоставлять возможность использования пространств имен, например, команда 'who' выводит список доступных переменных:
    In [5]: who
    msg msgflag pi warning

    Она имеет ряд опций, например, чтобы вывести переменные типа int, следует написать:
    In [6]: who int
    msgflag pi

    Если требуется получить дополнительную информацию о переменных, можно воспользоваться командой 'whos':
    In [7]: whos
    Variable   Type        Data/Info
    --------------------------------
    msg        str         hello
    msgflag    int         1
    pi         int         3
    warning    NoneType    None
    

    Так же есть возможность поиска по имени переменной, для этого нужно использовать команду 'psearch':
    In [8]: psearch msg*
    msg
    msgflag

    Возможно расширить критерии поиска типом переменной, например:
    In [9]: psearch msg* int
    msgflag

    Для того чтобы сохранить переменную в профайле(она будет доступна после перезапуска IPython) есть команда 'store':
    In [10]: store msgflag
    Stored 'msgflag' (int)

    Так же есть возможность сохранить переменную в отдельный файл:
    In [11]: store msgflag > /tmp/m.txt
    Writing 'msgflag' (int) to file '/tmp/m.txt'.

    Чтобы посмотреть сохраненные переменные, вводится команда 'store' без параметров:
    In [12]: store
    Stored variables and their in-db values:
    msgflag -> 1

    Чтобы очистить текущее пространство имен, воспользуемся командой 'reset' и убедимся, что оно очистилось при помощи команды 'who':
    In [13]: reset
    Once deleted, variables cannot be recovered. Proceed (y/[n])? y

    In [14]: who
    Interactive namespace is empty.

    Можно восстановить переменные, которые были ранее сохранены при помощи команды 'store' и убедиться, что они восстановились командой 'who':
    In [15]: store -r

    In [16]: who
    msgflag

    Так же можно очистить все, что находится в store и при следующем старте пространство имен будет пустым:
    In [17]: store -z

    Логгирование


    Другая полезная возможность IPython — логгирование. Команда 'logstate' проверяет текущее состояние логгера:
    In [18]: logstate
    Logging has not been activated.

    Командой 'logstart' можно начать логгирование:
    In [19]: logstart
    Activating auto-logging. Current session state plus future input saved.
    Filename : ipython_log.py
    Mode : rotate
    Output logging : False
    Raw input log : False
    Timestamping : False
    State : active

    Лог сохраняется в текущей директории как исходный код Python
    Команды 'logon' и 'logoff' используются для включения/выключения логгирования:
    In [20]: logoff
    Switching logging OFF

    In [21]: logon
    Switching logging ON

    Магические команды


    Команды, описанные выше в терминологии IPython называются magic commands(магические команды). Для того, чтобы посмотреть полный список magic команд, нужно ввести 'lsmagic':
    In [22]: lsmagic
    Available magic functions:
    %Exit %Pprint %Quit %alias %autocall %autoindent %automagic %bg %bookmark %cd %clear %color_info %colors %cpaste %debug %dhist %dirs %doctest_mode %ed %edit %env %exit %hist %history %logoff %logon %logstart %logstate %logstop %lsmagic %macro %magic %p %page %pdb %pdef %pdoc %pfile %pinfo %popd %profile %prun %psearch %psource %pushd %pwd %pycat %quickref %quit %r %rehash %rehashx %rep %reset %run %runlog %save %sc %store %sx %system_verbose %time %timeit %unalias %upgrade %who %who_ls %whos %xmode

    Automagic is ON, % prefix NOT needed for magic functions.

    Магические команды могут использовать знак процента в качестве префикса. Это полезно в случае, если имя переменной совпадает с именем команды.
    Для вызова помощи по всем магическим командам используется 'magic' команда. Для получения справки по определенный магической команды достаточно просто поставить знак вопроса в конце:
    In [23]: lsmagic?
    Type: Magic function
    Base Class: <type 'instancemethod'>
    String Form: <bound method InteractiveShell.magic_lsmagic of <IPython.iplib.InteractiveShell object at 0x9e5ef0>>
    Namespace: IPython internal
    File: /Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/site-packages/ipython-0.9.1-py2.5.egg/IPython/Magic.py
    Definition: lsmagic(self, parameter_s='')
    Docstring:
    List currently available magic functions.

    Для получения дополнительной информации следует ввести 2 знака вопроса в конце команды, в таком случае выводится и исходный код команды-функции.

    Для переменных определенных самостоятельно, можно так же использовать знак вопроса:
    In [24]: msgflag?
    Type: int
    Base Class: <type 'int'>
    String Form: 1
    Namespace: Interactive
    Docstring:
    int(x[, base]) -> integer

    Convert a string or number to an integer, if possible. A floating point
    argument will be truncated towards zero ...

    Некоторые «косметические» команды


    Можно использовать 'p' как сокращение для 'print':
    In [25]: import sys

    In [26]: p sys.path
    ['', '/Library/Frameworks/Python.framework/Versions/2.5/bin', '/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/site-packages/setuptools-0.6c9-py2.5.egg', '/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/site-packages/bdist_mpkg-0.4.3-py2.5.egg', '/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/site-packages/macholib-1.1-py2.5.egg',
    ...


    Так же можно пользоваться сокращенной формой для вызова функций:
    In [27]: def x(a, b):
    ....: print a, b
    ....:
    ....:

    In [28]: x 3, 4
    -------> x(3, 4)
    3 4


    Для вызова функции можно сделать так:
    In [29]: def x(): print "123"
    ....:

    In [30]: /x
    -------> x()
    123


    Можно вызвать функцию, которая в качестве параметров принимает строки, без необходимости заключать их в кавычки:
    In [31]: def x(a,b): print "%s-%s" % (a, b)
    ....:

    In [32]: , x astr bstr
    -------> x("astr", "bstr")
    astr-bstr

    Интроспекция


    Если вы забыли какие аргументы нужны для вызова функции или метода, вы всегда можете узнать это при помощи команды 'pdef':
    In [37]: import re

    In [38]: pdef re.match
    re.match(pattern, string, flags=0)


    Так же можно посмотреть документацию по этой функции:
    In [39]: pdoc re.match
    Class Docstring:
    Try to apply the pattern at the start of the string, returning
    a match object, or None if no match was found.
    Calling Docstring:
    x.__call__(...) <==> x(...)


    Всю информацию о функции можно посмотреть при помощи команды 'pinfo':
    In [40]: pinfo re.match
    Type: function
    Base Class: <type 'function'>
    String Form: <function match at 0xaa2b70>
    Namespace: Interactive
    File: /Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/re.py
    Definition: re.match(pattern, string, flags=0)
    Docstring:
    Try to apply the pattern at the start of the string, returning
    a match object, or None if no match was found.


    Вы так же можете посмотреть исходный код функции:
    In [41]: psource re.match
    def match(pattern, string, flags=0):
    """Try to apply the pattern at the start of the string, returning
    a match object, or None if no match was found."""
    return _compile(pattern, flags).match(string)


    Если вы хотите посмотреть исходный код файла, в котором определен тот или иной объект, используйте команду 'pfile':
    In [42]: pfile re.match


    Так же можно запустить ваш любимый редактор для редактирования файла, в котором определен тот или иной объект:
    In [43]: edit -x re.match
    Editing...

    Ссылки на источники


    Скринкаст — http://showmedo.com/videos/video?name=1000010&fromSeriesID=100
    Официальная документация — http://ipython.scipy.org/moin/Documentation

    PS: На этом пока все, если эта тема кому-то интересна, то в следующих статьях продолжу описание возможностей IPython.
    Поделиться публикацией
    Комментарии 16
      0
      отлично, спасибо
        +1
        плюс в карму вам за труд.
        ps: переносите в python
          0
          Спасибо, перенес :)
          +2
          Тут есть важная особенность — ipython некорректно работает с юникодом. Я из-за этого полдня убил на поиски ошибки в своем коде при использовании boost.python, а оказалось что под чистым питоном все работает корректно.
            0
            Это да, но баг репорт уже есть на эту тему https://bugs.launchpad.net/ipython/+bug/339642
            так что вполне вероятно, что пофиксят в ближайших релизах
              0
              Надеюсь. Но про проблемы с юникодом я читал в архиве 2х летней давность в их рассылке.

              В любом случае, тема интересная :)
                0
                Это все он — Murkt. Если сильно надо, можете сами исправить :)
              0
              Спасибо за информацию!

              Пользуюсь ipython уже давно, но магическими командами особо не пользовался, только %time.
              Теперь возьму на вооружение whos, логирование и интроспекцию (постоянно приходилось лезть в соседнее окно, чтобы посмотреть параметры для функции).
                +1
                ipython также замечательно использовать в связке с django
                  +1
                  За один автокомплит и удобную навигацию по докстрингам уже можно ему ставить памятник.
                  Остальные функции хороши когда проект слишком большой или изучается чужая программа.
                    0
                    Автокомплит и в стандартном шелле включается несложно, на хабре был топик на эту тему.
                    0
                    Вопрос: а как заставить ipython переимпортить все импортированные к настоящему моменту модули, перечитывая их (изменившийся) код? Когда-то искал немного, но не нашел, как это сделать. Если редактируешь модуль, чтобы его протестить в терминале приходится перезапускать ipython и заново импортить модуль перед вызовом нужного метода…
                      0
                      reload
                      оно?
                        0
                        да, reload отчасти помогает
                        но у него есть некоторые не очень приятные caveats, описанные в док-ии, потом хочется уметь релоадить сразу все и также уметь релоадить только конкретный класс. может, я слишком много хочу от питона? :)
                      0
                      За %edit спасибо.

                      Дефолтный вид ipython показался довольно многословным, но это легко настраивается

                      $ vim ~/.ipython/ipythonrc

                      # странно прашивать «желаете ли выйти?» если уже ввел «exit()»
                      confirm_exit 0

                      # стадартный вид строки
                      prompt_in1 '>>> '
                      prompt_in2 '… '
                      prompt_out ''
                      separate_in 0
                      separate_out 0
                      separate_out2 0

                      А еще убрал шапку с версией и справкой.
                        0
                        Большое спасибо за статью из 2016 года :)

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

                        Самое читаемое