2015/05/02

import の使い方

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

Pythonで他のモジュールやパッケージを読み込む方法といえば import ですが、その import にもいろいろな使い方があります。

以下、代表的な使い方を見てみましょう。

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


import xyz

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

xyz ライブラリのうち一部の名前だけ読み込む


from xyz import a_func

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

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


* を使うと、そのライブラリの中のすべての名前をインポートしてくることができます。ただしアンダースコア 2 つで囲われた __abc__ という形の名前は対象外となります。

from xyz import *

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

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

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


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
from lib.subdir import b

# b.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)

以上です。


参考
- 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: Get relative path from comparing two absolute paths - Stack Overflow
- Python Packages and You - _habnablog

0 件のコメント: