Pythonのimport文の考察

複数のパッケージを取り扱うプログラムを作っていると、パッケージ同士、あるいはプログラムからパッケージをインポートすることになります。

この時、import文でパッケージの指定やPythonスクリプトを実行するカレントディレクトリの位置によって、思ったようにインポートできないことがあります。

マニュアルを読んでもいまいちすっきりしないので、いろいろなディレクトリ構成でサンプルプログラムを書いて実験してみました。

以下のようなPythonスクリプトを作成します。

スクリプトファイル 呼び出すモジュール
main.py book.py, book_shelf.py
book_shelf.py book.py

■book.py

class Book:
    num = 0 # Bookオブジェクトの数

    def __init__(self, title, author):
        self._title = title
        self._author = author
        Book.num += 1

    @property
    def info(self):
        return '{}({} 著)'.format(self._title, self._author)

■book_shelf.py

from book import Book

class BookShelf:
    def __init__(self, books):
        self._books = books

    def list(self):
        for i in self._books:
            print(i.info)

        print('現在、{}冊の本があります。'.format(Book.num))

■main.py

from book_shelf import BookShelf
from book import Book

bs = BookShelf([
        Book('Python入門', '蛇山太郎'),
        Book('Ruby入門', '赤石次郎'),
        Book('Java入門', '黒豆五郎'),
        Book('R入門', '統計進次郎'),
        ]
        )

bs.list()

book.pyとbook_shelf.pyは常に同一ディレクトリに配置し、main.pyの配置ディレクトリを変更して、実行結果がどうなるかを確認してみます。

同一ディレクトリにある別のPythonモジュールをインポートする

以下のようにスクリプトファイルを配置します。

mod
├── book.py
├── book_shelf.py
└── main.py

■実行結果
カレントディレクトリをmodにして実行する。

$ pwd
mod
$ python main.py
Python入門(蛇山太郎 著)
Ruby入門(赤石次郎 著)
Java入門(黒豆五郎 著)
R入門(統計進次郎 著)
現在、4冊の本があります。

main.pyを一階層上のディレクトリに移動し、カレントディレクトリもそこへ移動してから実行する。
〜実験中〜