You are currently viewing Команды IPython и оболочки

Команды IPython и оболочки

При интерактивной работе со стандартным интерпретатором 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 путем добавления префикса с !символом. Например, команды lspwd, и 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 происходит гораздо меньше переключений между интерпретатором и оболочкой.