複数のパッケージを取り扱うプログラムを作っていると、パッケージ同士、あるいはプログラムからパッケージをインポートすることになります。
この時、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を一階層上のディレクトリに移動し、カレントディレクトリもそこへ移動してから実行する。
〜実験中〜