強力なPythonシェル(REPL)のIPythonをインストールして試した事を説明しています。IPythonには強力なコード自動補完機能、マジックコマンド(マジック関数)などがあり、システム(bashなどのシェル)コマンドの実行もできます。
※ 本ページはプロモーションが含まれています。
IPythonは、対話形式(REPL)でpythonのコードを実行できます。標準のPythonにもREPL(Pythonシェル)は付いていますが、IPythonは標準のPythonのREPLよりも強力で便利な機能が付いているので、pythonコードを試すのにはメリットが大きい実行環境です。
REPLはRead-Eval-Print Loopの略称で、対話形式でpythonなどのコードを実行して評価して結果を出力してくれます。
ここでは、IPythonをインストールして、実際にIPythonを試しながら便利な機能を説明していきます。
■動作環境とバージョン情報です。
OS:macOS Big Sur(バージョン11.4)
Pythonバージョン:3.9.0
インストールしたIPython:7.25.0
$ python -V
Python 3.9.0
まずはIPythonをインストールします。ここではpipを使ってインストールしていきます。
現状、私の環境のpipのパッケージ一覧です。
$ pip list
Package Version
---------- -------
pip 21.1.3
setuptools 49.2.1
それでは、IPythonをインストールします。
$ pip install ipython
Collecting ipython
Using cached ipython-7.25.0-py3-none-any.whl (786 kB)
〜
Successfully installed appnope-0.1.2 backcall-0.2.0 decorator-5.0.9 ipython-7.25.0 ipython-genutils-0.2.0 jedi-0.18.0 matplotlib-inline-0.1.2 parso-0.8.2 pexpect-4.8.0 pickleshare-0.7.5 prompt-toolkit-3.0.19 ptyprocess-0.7.0 pygments-2.9.0 traitlets-5.0.5 wcwidth-0.2.5
$ pip list
Package Version
----------------- -------
appnope 0.1.2
backcall 0.2.0
decorator 5.0.9
ipython 7.25.0
ipython-genutils 0.2.0
jedi 0.18.0
matplotlib-inline 0.1.2
parso 0.8.2
pexpect 4.8.0
pickleshare 0.7.5
pip 21.1.3
prompt-toolkit 3.0.19
ptyprocess 0.7.0
Pygments 2.9.0
setuptools 49.2.1
traitlets 5.0.5
wcwidth 0.2.5
ipythonをインストールできました!バージョンは7.25.0です。ipythonに依存するパッケージも色々とインストールされました。
IPythonをインストールできたので、早速使ってみます。
IPythonはipythonコマンドで起動できます(IPythonのREPLが起動して、"In [n]"というプロンプトが表示される)。
$ ipython
Python 3.9.0 (default, Jan 9 2021, 22:05:52)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.25.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]:
簡単なpythonコードを実行してみます。
In [1]: print("hello,world")
hello,world
In [2]: 3 ** 3
Out[2]: 27
IPythonを終了したい場合、exitかquitです。
In [3]: exit
$
ちょっと見た感じでは、標準のpythonのREPLと比較すると、プロンプトが違うのと色付き(上のコマンド実行例だとすべて白にしちゃっていますが)ですね。
IPythonは、標準のpythonシェル(REPL)を強化した物という事なので、そのあたりをもう少し使いながら見ていきたいと思います。
まず、IPythonは自動入力補完機能(統合開発環境IDEによくあるオートコンプリート機能みたいな感じ)が非常に便利です。
"im"と入力してタブキーを入力すると、入力補完で"import"となります。
そして、そのあとに例えば"t"と入力してタブキーを入力すると、"t"で始まるパッケージ(モジュール)の候補が表示されます。
さらに続けて"i"と入力してタブキーを入力すると、入力補完で"time"となり、"time"で始まるパッケージの候補に絞られます。
このままtimeモジュールをインポートして、timeモジュールを使ってみます。
In [1]: import time;
In [2]:
"ti"と入力してタブキーを入力すると、"ti"で始まる候補が表示されるので、timeモジュールを選択します。こんな感じで入力補完(コード補完)が使えるので、楽にコードを書けるようになって非常に便利です。
IPythonの入力補完は、モジュール、メソッド、変数、キーワード(定数)、また、標準シェルのコマンドやカレントディレクトリ内のファイルやディレクトリで機能します(IPythonではpythonコードだけでなく、標準シェルのコマンドなども使えます)。
標準のpythonシェル(REPL)にも入力補完機能は付いていますが、モジュールや標準シェルのコマンドの入力補完は無いですし、全体的にIPythonの入力補完の方が強力です。
上でも書きましたが、IPythonのREPL上では、標準シェル(bashなど)のコマンドを使う事ができます。
標準シェルのコマンドを使う時は、コマンド前に"!"を付けます。
In [1]: !ls -l
total 8
drwxr-xr-x 19 username staff 608 7 2 02:30 bin
drwxr-xr-x 2 username staff 64 7 2 02:27 include
drwxr-xr-x 3 username staff 96 7 2 02:27 lib
-rw-r--r-- 1 username staff 98 7 2 02:27 pyvenv.cfg
drwxr-xr-x 3 username staff 96 7 2 02:30 share
コマンドによっては、"!"を付けなくても使えます。
In [2]: ls -l
total 8
drwxr-xr-x 19 username staff 608 7 2 02:30 bin/
drwxr-xr-x 2 username staff 64 7 2 02:27 include/
drwxr-xr-x 3 username staff 96 7 2 02:27 lib/
-rw-r--r-- 1 username staff 98 7 2 02:27 pyvenv.cfg
drwxr-xr-x 3 username staff 96 7 2 02:30 share/
また、標準シェルのコマンドの結果をpythonの変数に代入して使う事もできます(この場合、コマンド前に"!"は必要です)。
In [3]: cdlist = !ls -l
In [4]: cdlist
Out[4]:
['total 8',
'drwxr-xr-x 19 username staff 608 7 2 02:30 bin',
'drwxr-xr-x 2 username staff 64 7 2 02:27 include',
'drwxr-xr-x 3 username staff 96 7 2 02:27 lib',
'-rw-r--r-- 1 username staff 98 7 2 02:27 pyvenv.cfg',
'drwxr-xr-x 3 username staff 96 7 2 02:30 share']
In [5]: type(cdlist)
Out[5]: IPython.utils.text.SList
コマンド結果を受け取った変数の型はSListですね。
こんな感じで、IPythonではpythonコードとシェルのコマンドを同時に使う事ができます。
IPythonではなく、標準のPythonシェル(REPL)上でシェルコマンドを実行したい場合、osモジュールやsubprocessモジュールを使うなどいくつかの方法があります。
それについては別ページで説明していますので、興味のある方は参考にしてください。
PythonのREPL上でシステムコマンドを実行する方法
IPythonのプロンプトは"In [n]:"、コマンドの実行結果は"Out[n]:"となっていますが、これは入力したコマンドは"In"、コマンドの実行結果は"Out"という変数に自動で格納されて、その変数をあとで自由に使用する事が可能です。
In [6]: In
Out[6]:
['',
"get_ipython().system('ls -l')",
"get_ipython().run_line_magic('ls', '-l')",
"cdlist = get_ipython().getoutput('ls -l')",
'cdlist',
'type(cdlist)',
'In']
In [7]: Out
Out[7]:
{4: ['total 8',
'drwxr-xr-x 19 username staff 608 7 2 02:30 bin',
'drwxr-xr-x 2 username staff 64 7 2 02:27 include',
'drwxr-xr-x 3 username staff 96 7 2 02:27 lib',
'-rw-r--r-- 1 username staff 98 7 2 02:27 pyvenv.cfg',
'drwxr-xr-x 3 username staff 96 7 2 02:30 share'],
5: IPython.utils.text.SList,
6: ['',
"get_ipython().system('ls -l')",
"get_ipython().run_line_magic('ls', '-l')",
"cdlist = get_ipython().getoutput('ls -l')",
'cdlist',
'type(cdlist)',
'In',
'Out']}
Inの型はlist、Outの型はdictですね。
In [8]: type(In)
Out[8]: list
In [9]: type(Out)
Out[9]: dict
次に、IPythonのヘルプなどについてです。まず、"?"でヘルプを開いて見る事ができます。
In [1]: ?
IPython -- An enhanced Interactive Python
=========================================
IPython offers a fully compatible replacement for the standard Python
〜
また、"%quickref"でクイックリファレンスが見れます。
In [2]: %quickref
IPython -- An enhanced Interactive Python - Quick Reference Card
================================================================
obj?, obj?? : Get help, or more help for object (also works as
?obj, ??obj).
?foo.*abc* : List names in 'foo' containing 'abc' in them.
%magic : Information about IPython's 'magic' % functions.
Magic functions are prefixed by % or %%, and typically take their arguments
〜
クイックリファレンスは、IPythonで使えるコマンドが端的にまとまっているので便利です。
また、オブジェクトや変数の語尾に"?"を付けると、そのオブジェクトや変数の情報やヘルプを見る事ができます。
sysモジュールをインポートして、ヘルプを見てみます。
In [3]: import sys;
In [4]: sys?
Type: module
String form: <module 'sys' (built-in)>
Docstring:
This module provides access to some objects used or maintained by the
〜
今度は、list型の変数を作って、変数からヘルプや情報を見ます。
In [5]: var_list = [1,2,3]
In [6]: var_list?
Type: list
String form: [1, 2, 3]
Length: 3
Docstring:
Built-in mutable sequence.
〜
IPythonには、IPython独自のマジックコマンド(マジック関数)もあります。
例えば、"%timeit"コマンドはコードの実行時間を計測します(マジックコマンドの頭には、"%"を付けます。)。
In [1]: %timeit 3 ** 3
10.4 ns ± 0.238 ns per loop (mean ± std. dev. of 7 runs, 100000000 loops each)
"of 7 runs, 100000000 loops each"と書いてあるのは、100000000回のループ数とループ内で7回の実行数という意味です。
ループ数を指定したい場合は-nオプション、実行数を指定したい場合は-rオプションで指定できます。
In [2]: %timeit -n 1000000 -r 5 3 ** 3
11 ns ± 0.516 ns per loop (mean ± std. dev. of 5 runs, 1000000 loops each)
次に、"%load"コマンドは、pythonファイルを指定して読み込んで、ファイルの内容を出力して実行します。
In [3]: cat hello.py
print("hello world!")
In [4]: %load hello.py
In [5]: # %load hello.py
...: print("hello world!")
...:
hello world!
"%run”コマンドも、pythonファイルを指定して読み込んで実行できます(ファイルの内容は出力しない)。
In [6]: %run hello.py
hello world!
"%whos"コマンドは、IPython上で定義した変数やオブジェクトの一覧を表示して確認できます。
In [7]: a = 99
In [8]: b = "hoge"
In [9]: c = [1,2,3]
In [10]: d = (1,2,3)
In [11]: import math;
In [12]: import sys;
In [13]: %whos
Variable Type Data/Info
------------------------------
a int 99
b str hoge
c list n=3
d tuple n=3
math module <module 'math' from '/Use<...>th.cpython-39-darwin.so'>
sys module <module 'sys' (built-in)>
マジックコマンド(マジック関数)の一覧は、"%lsmagic"コマンドで確認する事ができます。
In [14]: %lsmagic
Out[14]:
Available line magics:
%alias %alias_magic %autoawait %autocall %autoindent %automagic %bookmark %cat %cd %clear %colors %conda %config %cp %cpaste %debug %dhist %dirs %doctest_mode %ed %edit %env %gui %hist %history %killbgscripts %ldir %less %lf %lk %ll %load %load_ext %loadpy %logoff %logon %logstart %logstate %logstop %ls %lsmagic %lx %macro %magic %man %matplotlib %mkdir %more %mv %notebook %page %paste %pastebin %pdb %pdef %pdoc %pfile %pinfo %pinfo2 %pip %popd %pprint %precision %prun %psearch %psource %pushd %pwd %pycat %pylab %quickref %recall %rehashx %reload_ext %rep %rerun %reset %reset_selective %rm %rmdir %run %save %sc %set_env %store %sx %system %tb %time %timeit %unalias %unload_ext %who %who_ls %whos %xdel %xmode
Available cell magics:
%%! %%HTML %%SVG %%bash %%capture %%debug %%file %%html %%javascript %%js %%latex %%markdown %%perl %%prun %%pypy %%python %%python2 %%python3 %%ruby %%script %%sh %%svg %%sx %%system %%time %%timeit %%writefile
Automagic is ON, % prefix IS NOT needed for line magics.