こんにちは!フリーランスエンジニア・ライターの平山です。
みなさんは、Pythonのプログラミング中にimportができない場面に出くわしたことはありませんか?
プログラミングの学習者にとって、嫌なものの一つに「突然発生するよくわからないエラー」がありますよね。
この記事では、
・importエラーとは何か?
・そもそも、パッケージ、モジュール、ライブラリとは何か?
・import, from, as, はどうやって使うのか?
という基本的な内容から、
・環境、OSごとのimportエラーをそれぞれ解決する方法
・パッケージのインストール方法
などのすぐに役立つ応用的な内容についても解説していきます。
この記事を読んで、やっかいなimportエラーとおさらばしましょう!
本記事を読む前に、Pythonがどんなプログラミング言語なのかをおさらいしておきたい人は次の記事を参考にしてください。
→ Pythonとは?特徴やできること、活用例をわかりやすく簡単に解説
なお、その他のPythonの記事についてはこちらにまとめています。
importの仕組みをおさらい
そもそもimportエラーとは?
はじめにimportエラーとはどういうものかを解説します。
ここまで何回もimportエラーという言い方をしてきましたが、
実際には次のようなエラーが出てimportができないことがほとんどでしょう。
import hoge #・・・コードが続く
#ここからがエラー文 Traceback (most recent call last): File "/Users/foo/py37/lib/python3.7/site-packages/IPython/core/interactiveshell.py", line 2961, in run_code exec(code_obj, self.user_global_ns, self.user_ns) File "<ipython-input-2-696af3277456>", line 1, in <module> import hoge File "/Applications/PyCharm.app/Contents/helpers/pydev/_pydev_bundle/pydev_import_hook.py", line 19, in do_import module = self._system_import(name, *args, **kwargs) ModuleNotFoundError: No module named 'hoge'
プログラミング初心者には心が折れそうになる文量ですが、
グッとこらえて重要なところを理解しましょう。
このエラー文で一番重要なのは最後の1行です。
Pythonのエラーは基本的に最後の1行を見ればどうしてエラーを起こしているのかがわかるようになっています。
ですので、これに限らず、まずは最後の1行を読む習慣をつけると問題解決能力がグッと高まって、いい感じに成長できます。
さて、本題に戻りまして、最後の1行を見てみると、
ModuleNotFoundError: No module named 'hoge'
とあります。これだけならなんとか行けそうな感じがしませんか?
この部分をざっくり訳すと「’hoge’ という名前のモジュールが見つからないよ!」となります。
つまり、この場合のimportエラーはPythonがモジュールを発見できなくてエラーを吐いていたわけですね。
ここでモジュールという新しい用語が出てきました。続いてはモジュールについて解説します。
モジュール、パッケージ、ライブラリとは?
モジュールとは?
モジュールについて公式ドキュメントでは次のように説明されています。
”モジュールは Python の定義や文が入ったファイルです。ファイル名はモジュール名に接尾語 .py がついたものになります。”
参考URL:https://docs.python.jp/3/tutorial/modules.html
ちょっと分かりにくいですね。初心者の段階では正確な定義よりも、
次のようなざっくりとした理解をしておくと応用が効きやすいでしょう。
モジュールとは:Pythonに新しい機能を追加するモノ
少し抽象的な表現なので、具体例で見ていきましょう。
たとえば、サイコロのように1から6までをランダムに表示するプログラムを作りたいとします。
このとき、Python自体には数字をランダムに選び出す、という機能がありません。
そこで使うのがrandamモジュールです。
このモジュールをimportすることで、Pythonは配列の中身を
ランダムに取り出すchoiceという関数を使えるようになります。
Pythonに新しい機能が追加されましたね。
実装例は下のようになります。
import random list = [1, 2, 3, 4, 5, 6] dice = random.choice(list) print(dice)
パッケージとは?
続いてパッケージについてです。パッケージは複数のモジュールを組み合わせたものになります。
先のモジュールの説明で、モジュールは(省略)ファイルです、
というものがありましたね。
このファイルが何個も集まってできたものがパッケージになります。
機械学習を学んでいる人にはおなじみのnumpyもパッケージの一つです。
ライブラリとは?
最後にライブラリ。これはPythonの公式な表現というよりも、他の言語を学んだ人たちが使いがちな表現で、モジュールとパッケージをまとめてライブラリと言ったりします。
C言語系ではPythonのモジュールとパッケージに相当するものがライブラリと呼ばれるため、慣習的にこう呼ばれることも多いようです。
また、今回のテーマからは若干それますが、標準ライブラリと言った場合は、Pythonに標準で搭載されている諸々の機能を指す言葉になります。
ごっちゃにならないよう注意しましょう。
それでは、モジュールやパッケージを実際に使うためにはどうすればいいのか?
importの使い方を次節で解説します。
import の使い方を徹底理解!
前の節でモジュールやパッケージはPythonに新しい機能を追加するモノ、
という説明をしました。
そして、そのモノを実際にPythonに導入してくれるのがimportコマンドになります。
importコマンドは次のように使います。
import <モジュール名> #例 import random import numpy
importの後ろにモジュール名、パッケージ名を書くのが基本の使い方になります。
このときモジュールの名前を書き間違えてしまうと、importエラーが
発生してしまうため、注意が必要ですね。
また、インポートした機能を使うには、パッケージ名.関数名のように書きます。
前節のサイコロプログラムの例を見てみると
random.choice(list)
というようになっているのがわかりますね。
Importにはよく組み合わせられる2つのキーワードがあります。
こちらも覚えておくことでより読みやすいコードが書けるようになります。
1つ目はfromこれは次のように書きます。
from <モジュール名> import <関数・変数名>
fromの方にモジュール名が移動して、importには関数、変数名が入りましたね。
これは何をしているのかというと、モジュールの中にある関数、変数を
ダイレクトに使えるようにしているんです。
具体例を見てみましょう。サイコロプログラムをfromを使って書き換えたものが次のようになります。
from random import choice list = [1, 2, 3, 4, 5, 6] dice = choice(list) print(dice)
注目してもらいたいのが4行目。以前はrandom.choice(list) となっていたものが choice(list)になっています。
普通にimportを使った場合、モジュール名.関数名としなければいけないところを、
fromを使うことで関数名のみで使えるようになっています。
これは短いコードだとありがたみを感じにくいかもしれませんが
- 何度も繰り返し同じモジュールの関数を使う場合
- 特定のモジュールの1つの関数だけを使いたい場合
効果を発揮します。
覚えておくとコードがすっきりしますね。
注意点として、from importで関数を直接読み込んだ場合
モジュール内の他の関数は使えなくなります。
モジュール内の関数を複数使ってコードをすっきりさせたい場合は
次に紹介するasを使うといいでしょう。
キーワードの2つ目はasこれは次のように書きます。
import <モジュール名> as <別名>
こちらはモジュールの名前を別名に置き換えてしまうキーワードです。
例えば次のように使います。
import random as rd dice = rd.choice(list)
今までrandom.choice(list)と書かれていた部分がrd.choice(list)に置きかわりました。
こちらも長いコードを書くときにタイプ数が減って、楽ができる機能です。
また、業界によっては定番の別名が存在することも多くあります。
機械学習分野では
import numpy as np
という書き方がもはや業界標準になっている感があるので、機械学習に興味のある方は覚えておくと良いでしょう。
from, import, asは全部組み合わせて次のように使うこともできます。
from random import choice as ch
上手に使ってすっきり読みやすいコードを目指しましょう!
importについてしっかりとした理解ができました。
次章ではimportエラーを状況別に解決していきましょう。
まずは環境をチェック
pythonのバージョンは2?3?
それでは早速importエラーを状況別に解決していきます。
まずはじめに行いたいことは、Pythonのバージョンを確認することです。
なんでここでバージョン確認?という方もいるでしょう。
Pythonには現在大きくわけて2系と3系があります。
そして、MacやLinux環境ではデフォルトで
2系がインストールされていることが多いのです。
ですが、最近の教科書では3系をインストールして使うことが多く、結果として
パソコン内に2系と3系が混在していることがよくあります。
その結果何が起こるかというと、Python3にモジュールをインストールしたつもりが、
実際にインストールされていたのは2の方だった、といったことがよく起こるわけです。
なので、自分の使いたい環境を確認する
→その環境にモジュールがインストールされているか確認する
という流れがimportエラー解決のための最速の手順なわけです。
自分の使いたい環境を確認することはとても大事なので
手順に入る前にしっかりと調べておきましょう。
では、Pythonのバージョンチェックの具体的なやり方です。
やることは単純でターミナルに以下のコマンドを入力するだけです。
python3 -V #2系の場合は python -V
バージョンが確認できたら次に進みましょう。
ちなみに、ターミナルがよくわからない!とか、黒画面こわい!という人は
次の記事を読むと、ちょっと気楽にターミナルが使えるようになります。
仮想環境は正しいものを使ってる?
次にチェックすべき環境の項目は仮想環境を使っているかどうか?です。
仮想環境についてざっくり説明すると
コンピュータの中に独立した環境を作ること、です。
Pythonでは比較的カンタンに仮想環境が作れます。
そのため、
「仮想環境を作ってそこにモジュールをインストールするといいよ」
といったアドバイスをネット上でよく見かけます。
ですが、使い慣れた人には便利な機能も初心者にとっては混乱のもと。
これは筆者の失敗談なのですが、Pythonを学び始めたころに訳も分からずネットにあったコードをコピペしまくった結果、よく分からない仮想環境が15個ほどできてしまったことがありました。
1から整理していくのは大変そうだったので、その時はPythonそのものをアンインストールして、泣く泣く1から環境を作り直すハメになりました・・・
そんな悲しい事態にならないためにも、仮想環境の確認はしっかりやっていきましょう!
Python3には標準で仮想環境構築ツールのvenvが搭載されています。
venvを使って、仮想環境「py37」を作っている場合を想定して話を進めていきます。
Mac、Linuxの場合
ターミナルからpy37フォルダ→binフォルダと移動していき
次のコマンドを使って仮想環境をアクティブにします。
source activate
Windowsの場合
binフォルダがScriptsフォルダに変わりますが
同じように移動して、次のコマンドを入力します。
.activate
どのOSの場合も同じように、ターミナルの頭に(py37)といったものが表示されます。
py37の部分は環境につけた名前によって変わります。
これで無事仮想環境に入ることができました!
仮想環境から出る場合は次のコマンドを入力します。
deactivate
最後に、最近人気のあるディストリビューションのAnacondaについて、注意点を見ていきましょう。
Anaconda使用時の注意点
AnacondaはAnaconda, Inc.が提供しているPythonのディストリビューションです。
ディストリビューションとは、「便利なパッケージを一つにまとめたもの」という意味合いです。
Anacondaは機械学習向けに便利なパッケージがひとまとめにされており
AIやディープラーニングといった最近流行りの分野でよく使われています。
Anacondaに興味のある人はこちらの記事も参考になるでしょう。
なにかと便利なAnacondaなのですが、importに関しては少々厄介な性質があります。
それは、Anacondaは独自のPythonと仮想環境をもつ、というところです。
今まで、Python2とPython3, そして仮想環境で場合分けしてきましたが、そこにさらにAnacondaとその仮想環境が加わる、ということです。
この章の最初で、自分の使いたい環境をしっかり確認してください、と、しつこく言い続けたのはこの複雑さが原因なのです。
これらがしっかりと区別できていないと、Anacondaの仮想環境にモジュールをインストールしたつもりがPython3の本体の方にインストールされていた!なんてことが起こりうる訳です。
importがうまくできない人の多くはここでつまづいているのではないでしょうか。
各環境の違いをしっかり把握して、自分の使いたい環境を見定めましょう。
では、Anacondaについても仮想環境の使い方を見ていきましょう。
Anacondaがインストール済みであることを前提に話を進めていきます。
まずはAnaconda内に仮想環境があるかどうか確認します。
次のコマンドを入力してください。
conda info -e
すると次のような出力が帰ってきます。
#環境名 #環境のパス。人によって異なります。 base * /opt/conda env1 /opt/conda/envs/env1
baseはAnacondaがデフォルトで持っている環境です。
そこから下は人によってそれぞれ異なる仮想環境があることでしょう。
そして重要なことは、アスタリスク(*)がついている環境が今いる環境ということです。
env1環境をアクティブにしたい場合は次のコマンドを入力します。
source activate env1
頭の表示が(base)→(env1)のように切り替わったのを確認してください。
これでAnacondaの仮想環境に入ることができました。
以上でおよそ考えられるすべての環境差を網羅しました。
使うべき環境に移動できたら、最後に必要なものの確認とインストールを行いましょう!
ライブラリがインストールされているか確認
前の章で使いたい環境に無事到着できました。
ここからはその環境にモジュールがあるかを確認して
なければインストールするまでを見ていきましょう。
Anaconda環境の場合、conda
まずはじめに、絶対に確認してほしいことがあります。
Anacondaを使っている場合はこれから紹介するcondaを使うようにしてください。
前の章でAnacondaはPythonから独立して環境を持っている、と説明しましたが
実はモジュールの管理についても独立した仕組みを持っています。
そのため、Anaconda側とPython側の両方から同じモジュールをインストールできてしまいます。
ですが、それぞれのモジュールには互換性が無いため、お互いを上書きし合い
最悪Anacondaそのものの環境を破壊してしまう可能性があるようです。
この問題は2018年9月現在も解決されていなようなので
Anacondaを使う場合はcondaを使う、と
覚えておいてください。
参考:Anacondaの環境が吹き飛んだ例
URL:https://github.com/ContinuumIO/anaconda-issues/issues/1970
では、実際にモジュールの確認とインストールをしていきましょう。
まずは確認から。
インストールされているモジュールの一覧を出すには次のコマンドを入力してください。
conda list
モジュール、パッケージをインストールするには次のコマンドを入力します。
conda install <パッケージ名>
また、この方法ではままパッケージが見つからない、ということもあります。
そんな時は下のコマンドも試してみてください。
conda install -c conda-forge <パッケージ名>
こちらは、有志がAnacondaのためにパッケージをまとめているconda-forgeからパッケージを探してくるコマンドになります。
conda-fogeにはかなりの数のパッケージがあるので
だいたいのパッケージはここを探せば解決します。
続いて、Anacondaが入っていない環境でのやり方を紹介します。
Anacondaが入っていない場合、pip
Anacondaがない環境では、標準で提供されている機能のpipを使います。
Python2とPython3が両方ある環境では、pipを使うと2の環境、
pip3を使うと3の環境にそれぞれインストールできます。
Python3しかはいっていない環境ではpip, pip3どちらでも同じ動作をするので
気にせず使っていきましょう。
さっそく具体的なコマンドです。
まずは一覧の表示から。
pip freeze
パッケージをインストールするには
pip install <パッケージ名>
pipの方は公式に提供されているツールなので
ほしいパッケージが見つからない、ということはまずありません。
それでは最後にインストールとimportの実践をしてみましょう。
インストールとimportを実際にやってみる
この記事の総決算ということで、実際にモジュールをインストールして
簡単なプログラムを動かしてみましょう。
今回はAnacondaの仮想環境とPython3の仮想環境ではないふつうの環境で動かすことにします。
インストールするモジュールはtqdmにしました。
これはfor文などの進捗状況を表示してくれるちょっと便利なモジュールです。
まずやる事は、自分の使いたい環境の確認、でしたね。
Anacondaの仮想環境に入れているか、Python3のふつうの環境にいるかどうかしっかり確認してください。
続いてモジュールのインストールです。
Anacondaの場合
conda install tqdm
pipを使う場合
pip3 install tqdm
Successfully installed tqdm-4.25.0 のように無事にインストールが成功したことを確認してください。
この時点で、importができない、エラーが出てうまくいかない
という問題は解決しているはずです。
最後に簡単なプログラムを動かしてimportの復習とtqdmを実際に使ってみましょう。
先ほどのサイコロプログラムを100回振るようにして、進捗状況を表示させてみたいと思います。
ソースはこちらになります。
from random import choice as ch from tqdm import tqdm from time import sleep list = [1, 2, 3, 4, 5, 6] for i in tqdm(range(100)): dice = ch(list) print(dice) sleep(0.1)
実行すると
91%|█████████ | 91/100 [00:09<00:00, 9.65it/s]4 92%|█████████▏| 92/100 [00:09<00:00, 9.65it/s]5
のように進捗状況と末尾にランダムな数字が表示されるはずです。
なお、tqdmが不要になった場合は
conda uninstall tqdm pip3 uninstall tqdm
でキレイに消すことができます。
以上で今回の記事で扱ったことがすべて習得できました!お疲れ様でした!!
importができない!を最速で解決する・まとめ
いかがでしたか?
今回はimportができない状態を解決するために
- 環境別
- OS別
- Anaconda使用の有無
それぞれの切り口で環境の確認を行いながら、コマンドで解決する方法を紹介しました。
Pythonは環境ごとの違いがまだまだ大きいため、環境を確認をしっかりすることがエラー解決への第一歩です。
importのエラーで悩まされたら、またこの記事を確認してください!
本記事の内容以外で、Pythonを勉強中の方はぜひ以下の記事も参考にしてください。
Pythonでできることや学習法など、入門用の知識をわかりやすくまとめました。
【Python入門完全攻略ガイド】