Pythonの利用法

前提

Pythonは、処理系自体の実装はミニマルを心掛けていて、機能の追加はライブラリやモジュール、パッケージなどと呼ばれるPython自身で書かれたコード群によって行われる。C言語などのコンパイルしてバイナリを動かす仕組みでは、コンパイル済みのライブラリを実行時にロードするOSの仕組みを利用して、バイナリを小さくする工夫がある。Pythonでは、モジュールの読み込みがコードの中で明示され、ソースレベルで行われる。モジュールのソースは、読み込みを高速化するためにコンパイル済みのもの(拡張子はpyc)をキャッシュとしておいておく。キャッシュは削除すれば、またコンパイルし直される。

  • import文の実行時に検索されるフォルダはsys.pathに指定されている。その中身は次の情報に基づいて初期化される。
    • 入力されたスクリプトのあるディレクトリ (あるいはファイルが指定されなかったときはカレントディレクトリ)。
    • PYTHONPATH (ディレクトリ名のリスト。シェル変数の PATH と同じ構文)。
    • インストールごとのデフォルト。
  • sys.pathはソースの中でも更新できる。

インストールされていないモジュールを使用するには、ソースをダウンロードして、sys.pathでカバーされているフォルダのいずれかに展開する。これを手動でやるか、半自動でやるか、自動でやらせるか、の選択を実行環境(i以下、マシン)ごとに判断しなければならない。

概況

プログラミング言語なので、インストールして使うのが基本だが、インストールの選択肢が豊富すぎて、入門時に迷うことになる。

  • Pythonの言語開発プロジェクトはhttps://python.org/が本拠で、ソースが定期的に更新される。WindowsとmacOSのためのインストール用パッケージもここから提供されている。
  • 主なLinux Distroは公式のPythonインストールパッケージを提供しており、yum、apt-getで指定してインストールできる。
  • Python独自のパッケージマネージャpipがある。(PythonはTeXのmakeindexのようなコマンドは不要なライブラリ構造を持っているが、インストールの管理を補助するのがpipの役割)
  • Pythonにはpyenvvirtualenvという環境マネージャもある。
  • Anacondaをインストールすれば、なんでもこれで管理できる。パッケージマネージャと環境マネージャの双方の機能を併せ持つ。コマンドラインではcondaである。
  • Windows用にはActive Pythonもある。Windowsでは、CygWinの上でapt-cyg、もしくはBash on Ubuntu on Windowsの上でapt-get、という選択肢もある。
  • macOSでは、HomebrewMacPortsが導入済みなら、それらからのインストールが可能である。

Pythonを長期間に渡って使用すると遭遇しやすい問題

どの手段を選択するのが良いかを説明する前に、Pythonの導入後に意図せずに陥る状況を整理しておく。

  • 公開されているコードを実行して学んでみようとしたら、import文でエラーが表示されて動かない。

ひとつ目は、必要なライブラリが自身の環境にインストールされていないことによる。標準ライブラリはPythonと共にインストールされているが、NumPy、Pandas、scikit-learnなど、データを扱う際に基本に近いライブラリですら、ユーザ自身もしくは管理者が必要に応じてインストールしなければならない。PythonのライブラリはPythonで書かれているものが多く、ソースを入手してPythonがインストールされているディレクトリのどこかに展開する必要がある。このために、pipというパッケージマネージャが用意されている。

  • それまで動いていたコードが急に、エラーを表示して動かなくなる。
  • チーム内、あるいは外部とコードを共有する際に、実行に必要なPythonのバージョンと利用するパッケージあるいはモジュールのバージョンの明示を要求される。
  • 開発する際に、用いるバージョンをPythonとパッケージとモジュールすべてで指定される。

これらはいずれも、Pythonが現在も活発に開発が進んでいる言語であること、Pythonのコアはミニマルな仕様を心がけていて多くの機能を標準ライブラリ、外部の組織が提供するパッケージに頼っていることに起因するトラブルです。例えば有名なscikit-learnやTensorFlow、またPyTorchなど、一つのパッケージが用いるコードの全てがその開発チームによって保守されていることは稀で、NumPyやPandasなど、複数のパッケージをベースに書かれている。そのため、ベースにしたNumPyやPandasなどのパッケージのバージョンが上がる際に、その変更内容が仕様の変更を伴うのに、利用しているパッケージへの影響発生を回避できないように更新されると、Pythonを取り巻く開発の渦の一番外側にいるユーザにまで影響が及び、昨日まで動いていたコードがエラーを表示して動かなくなるという影響を受ける。

Python本体と利用するすべてのパッケージのバージョンの組み合わせを、使っているPython環境と呼ぶと、これをシステム管理者によって更新されることは、プログラマーにとっては迷惑でしかない。そのため、Pythonを業務や研究に用いる際には、セキュリティホールの影響を受けない開発環境を構築することと、Python本体と利用するすべてのパッケージのバージョンを任意のもので固定し続けることの2つのスキルが必須になる。

Python独自のマネージャ

統計は持ち合わせていないが、Pythonに関するインターネット上の記述において、上の問題に対処するためのツールとして、pyenvとvirtualenvが紹介されている。これらは、必要は発明の母、の申し子と言える。

入門時の有力な選択肢の一つはAnacondaだ。これはパッケージマネージャだけでなく、仮想環境のマネージャも兼ねたcondaを中心としたインストール用パッケージで、Python以外にRStudio、Orange3、Visual Studio Codeなども扱う。pipとpyenvとvirtualenvの3つの機能を併せ持つと言える。Anacondaでインストールした環境でpipやpyenvを使うことや、pyenvでインストールしたAnaconda環境でpipとcondaを組み合わせて使うことも可能だが、それは、あまり推奨しない。また、コンソールを使える人は、pipとpyenvとvirtualenvの方が環境保守の作業内容が分かりやすく、作業をバッチにすることも可能なので、便利だろう。

以上のマネージャはすべて、Pythonで書かれているので、実行するためにPythonを必要とする。環境マネージャはPythonも複数持てるので、マネージャはマネージャ自身が管理するPythonの外にあるPythonに依存するのが良い。そしてJupyter NotebookはPythonで書かれたアプリケーションであり、Anacondaでもpipでもインストールできる。これはOrange3も同様。

お勧め

インターネットにアクセスできるマシンの上では、Pythonを最小構成でインストールし、pip、pyenv、virtualenvを導入してから、必要な環境を構築するのが良い。例えば、次の順序に作業をしていくことになる。

  1. Pythonの最小限のインストール
  2. pipのインストール
  3. pyenvのインストール
  4. pyenv-virtualenvのインストール
  5. pyenvを用いて、バージョンを指定してAnacondaをインストールするか、バージョンを指定してPythonをインストールする
  6. virtualenvで動作が確認された環境(のバージョン)を固定しておく

初心者で、そのマシンの上で長く使うかどうか決めてない場合には、まずはAnacondaをインストールするのもよい。

オフラインなマシンの上では、AnacondaをUSBメモリで持ち込むか、Pythonのインストーラと必要なライブラリのパッケージを個別にネットから持ってきてUSBメモリで持ち込んで、ライブラリのフォルダに展開するかのいずれか。