2015/05/02

import の使い方

Python の import 文の使い方をご紹介します。

Python で他のモジュールやパッケージを読み込む方法といえば import ですが、その import にもいろいろな使い方があります。以下、いくつか代表的な使い方を見てみましょう。

ライブラリ全体を読み込む


ライブラリ全体を読み込みたい場合は import ライブラリ名 と書きます。

import xyz

xyz.a_func()  # xyz の中で定義された関数 a_func() を呼び出す

ライブラリのうち一部の関数やクラス、定数だけを読み込む


ライブラリのうち使用する関数などが限られている場合は、 from ライブラリ名 import 関数名 という形で一部のみ取得することができます。

from xyz import a_func

a_func()  # xyz の中で定義された関数 a_func() を呼び出す

ライブラリの中にある名前をすべて読み込む


from ライブラリ名 import * と書けば、そのライブラリの中のすべての名前をインポートすることができます。ただしアンダースコア 2 つで囲われた __abc__ という名前のものはプライベート扱いになるためインポートされません。

from xyz import *

a_func()  # xyz の中で定義された関数 a_func() を呼び出す

また、この方法は言語仕様として可能は可能なのですが、 Python PEP20 の「 explicit rather than implicit 」(「暗黙」よりも「明示」)というポリシーを尊重するなら使うべきではありません。

独自の名前をつけて読み込む


import xxx の後に as エイリアス とつけると、インポートしてくる名前に別名をつけることができます。名前の衝突を防ぎたい場合や短縮形を使いたい場合に便利です。

from xyz import a_func as f

f()  # xyz の中で定義された関数 a_func() に別名 f() をつけて呼び出す

その他の方法


使用頻度は比較的低そうですが、その他の使い方も見ておきましょう。

相対パスを使って読み込む

Python 2.5 からは相対パスを使うこともできます。

次のようなディレクトリ構造で、 main から b.py を呼び出し、その b.py の中から a.py を利用したい場合を考えます。

main.py
lib/
  __init__.py
  a.py
  subdir/
    __init__.py
    b.py

この場合、 main の中で b.py を読み込む部分と b.py の中で a.py を読み込む部分は次のように書くことができます。

# main.py
# b.py を読み込む
from lib.subdir import b

# b.py
# a.py を読み込む
from .. import a

ただしこの方法は __init__.py を使ってパッケージ化されている場合でないと使えないようです。

普通のスクリプトの中でどうしてもひとつ上の階層の Python ファイルを読み込みたい場合にはパスを追加する形で実現することができます。

import os
import sys

path = os.path.join(os.path.dirname(__file__), '../')
sys.path.append(path)

ただしこの方法は推奨されていないようなので、「やむなく」な場合のみとするのがよさそうです。

import キーワードではなく関数を使って読み込む

import キーワードと同等の働きをする import.import_module という関数を使うこともできます。こちらは、読み込むライブラリ名が動的に決まるとき(?)なんかに便利でしょうか。

import importlib

# 3 つのライブラリを読み込む
libs = ['sys', 'os', 'math']
for lib in libs:
    importlib.import_module(lib)

以上です。

import に興味のある方は次のページも参考になるかもしれません。

Python Tips:- や . などの文字が入ったファイルを import で読み込みたい


参考
- 6. Simple statements — Python 2.7.8 documentation
- 30.2. importlib – Convenience wrappers for __import__() — Python 公式ドキュメント
- Python - how to refer to relative paths of resources when working with code repository - Stack Overflow
- Relative paths in Python - Stack Overflow
- Python Packages and You - _habnablog

0 件のコメント: