При интерактивной работе со стандартным интерпретатором Python одной из проблем является необходимость переключения между несколькими окнами для доступа к инструментам Python и системным инструментам командной строки. IPython устраняет этот пробел и предоставляет синтаксис для выполнения команд оболочки непосредственно из терминала IPython. Волшебство происходит с восклицательным знаком: все, что появляется после !
в строке, будет выполняться не ядром Python, а системной командной строкой.
Ниже предполагается, что вы используете Unix-подобную систему, такую как Linux или Mac OSX. Некоторые из приведенных ниже примеров приведут к сбою в Windows, которая по умолчанию использует оболочку другого типа (хотя с объявлением 2016 года о собственных оболочках Bash в Windows, вскоре это может больше не быть проблемой!). Если вы не знакомы с командами оболочки, я бы посоветовал ознакомиться с учебником по оболочке, составленным фондом «Всегда отличное программное обеспечение».
Краткое введение в оболочку
Полное введение в использование оболочки/терминала/командной строки выходит далеко за рамки этой главы, но для непосвященных мы предложим краткое введение здесь. Оболочка-это способ текстового взаимодействия с вашим компьютером. С середины 1980-х годов, когда Microsoft и Apple представили первые версии своих вездесущих графических операционных систем, большинство пользователей компьютеров взаимодействовали со своей операционной системой с помощью привычных щелчков меню и движений перетаскивания. Но операционные системы существовали задолго до этих графических пользовательских интерфейсов и в основном управлялись с помощью последовательностей ввода текста: в командной строке пользователь вводил команду, и компьютер делал то, что ему говорил пользователь. Эти ранние системы быстрого доступа являются предшественниками оболочек и терминалов, которые большинство активных исследователей данных все еще используют сегодня.
Кто-то, незнакомый с оболочкой, может спросить, зачем вам беспокоиться об этом, когда многие результаты могут быть достигнуты простым нажатием на значки и меню. Пользователь оболочки может ответить другим вопросом: зачем искать значки и нажимать меню, когда вы можете сделать это гораздо проще, набрав текст? Хотя это может показаться типичным тупиком технических предпочтений, при выходе за рамки базовых задач быстро становится ясно, что оболочка обеспечивает гораздо больший контроль над сложными задачами, хотя, по общему признанию, кривая обучения может запугать среднего пользователя компьютера.
В качестве примера, вот пример для Linux/OSX с раковиной сессии, где пользователь исследует, создает, изменяет и каталоги и файлы на своей системе (osx:~ $
приглашение, а все, что после $
знака набирается команда; текст, который предшествует #
понимается просто как описание, а не то, что вы хотели на самом деле тип в):
osx:~ $ echo "hello world" # echo is like Python's print function
hello world
osx:~ $ pwd # pwd = print working directory
/home/jake # this is the "path" that we're sitting in
osx:~ $ ls # ls = list working directory contents
notebooks projects
osx:~ $ cd projects/ # cd = change directory
osx:projects $ pwd
/home/jake/projects
osx:projects $ ls
datasci_book mpld3 myproject.txt
osx:projects $ mkdir myproject # mkdir = make new directory
osx:projects $ cd myproject/
osx:myproject $ mv ../myproject.txt ./ # mv = move file. Here we're moving the
# file myproject.txt from one directory
# up (../) to the current directory (./)
osx:myproject $ ls
myproject.txt
Обратите внимание, что все это просто компактный способ выполнять привычные операции (навигация по структуре каталогов, создание каталога, перемещение файла и т. Д.), Вводя команды, а не щелкая по значкам и меню. Обратите внимание, что всего с помощью нескольких команд (pwd
, ls
, cd
, mkdir
, и cp
) вы можете выполнять многие из наиболее распространенных файловых операций. Именно тогда, когда вы выходите за рамки этих основ, подход оболочки становится действительно мощным.
Команды оболочки в IPython
Любая команда, работающая в командной строке, может быть использована в IPython путем добавления префикса с !
символом. Например, команды ls
, pwd
, и echo
могут выполняться следующим образом:
In [1]: !ls
myproject.txt
In [2]: !pwd
/home/jake/projects/myproject
In [3]: !echo "printing from the shell"
printing from the shell
Передача значений в оболочку и из нее
Команды оболочки могут не только вызываться из IPython, но также могут взаимодействовать с пространством имен IPython. Например, вы можете сохранить вывод любой команды оболочки в список Python с помощью оператора присваивания:
In [4]: contents = !ls
In [5]: print(contents)
['myproject.txt']
In [6]: directory = !pwd
In [7]: print(directory)
['/Users/jakevdp/notebooks/tmp/myproject']
Обратите внимание, что эти результаты возвращаются не в виде списков, а в виде специального типа возврата оболочки, определенного в IPython:
In [8]: type(directory)
IPython.utils.text.SList
Это выглядит и действует очень похоже на список Python, но имеет дополнительные функции, такие как grep
методы fields
и sn
и p
свойства, и , которые позволяют вам искать, фильтровать и отображать результаты удобным способом. Для получения дополнительной информации об этом вы можете воспользоваться встроенными функциями справки IPython.
Связь в другом направлении–передача переменных Python в оболочку–возможна с использованием {varname}
синтаксиса:
In [9]: message = "hello from Python"
In [10]: !echo {message}
hello from Python
Фигурные скобки содержат имя переменной, которое заменяется содержимым переменной в команде оболочки.
Волшебные команды, связанные с оболочкой
Если вы некоторое время поиграете с командами оболочки IPython, вы можете заметить, что не можете использовать !cd
их для навигации по файловой системе:
In [11]: !pwd
/home/jake/projects/myproject
In [12]: !cd ..
In [13]: !pwd
/home/jake/projects/myproject
Причина в том, что команды оболочки в записной книжке выполняются во временной вложенной оболочке. Если вы хотите изменить рабочий каталог более устойчивым способом, вы можете использовать команду %cd
magic:
In [14]: %cd ..
/home/jake/projects
На самом деле, по умолчанию вы даже можете использовать это без %
знака:
In [15]: cd myproject
/home/jake/projects/myproject
Это называется automagic
функцией, и такое поведение можно переключать с %automagic
помощью волшебной функции.
Кроме %cd
того , другими доступными магическими функциями, подобными оболочке, являются %cat
, %cp
, %env
, %ls
, %man
, %mkdir
, %more
, %mv
, %pwd
, %rm
, и %rmdir
, любой из которых можно использовать без %
знака, если automagic
он включен. Это позволяет вам практически рассматривать приглашение IPython как обычную оболочку:
In [16]: mkdir tmp
In [17]: ls
myproject.txt tmp/
In [18]: cp myproject.txt tmp/
In [19]: ls tmp
myproject.txt
In [20]: rm -r tmp
Этот доступ к оболочке из того же окна терминала, что и ваш сеанс Python, означает, что при написании кода Python происходит гораздо меньше переключений между интерпретатором и оболочкой.