やり直しPython3(モジュール、パッケージ)

2016-05-06(Fri) by Makoto Yamahira

Python3の勉強(9) モジュール、パッケージ

Python基礎勉強9日目です。今回は「モジュール、パッケージ」について。
これまでは対話型インタープリタを使ってPythonの勉強を進めてきたが、何度も使うプログラムを作りたい場合この方法では不便だ。
ファイルにコードを記述し、モジュール、パッケージといった考え方を学ぶ。

ファイルにコードを記述する

「test.py」という名前で次のようなPythonコードを作ってみる。

test.py

print('テストコードです。')

このファイルを実行するには次のようにする。

    $ python test.py
    テストコードです。

コマンドライン引数は次のように使う。

test2.py

import sys
print('コマンドライン引数:', sys.argv)

使ってみる。

    $ python test2.py hello makohira
    コマンドライン引数: ['test2.py', 'hello', 'makohira']

モジュール

モジュールはPythonコードをまとめたファイルである。

module_test.py

some_var = 'makohira'

def hello(name):
    print('hello ', name)

def thanks(name):
    print('thanks ', name)

ファイル名がモジュール名になる。

    >>> import module_test
    >>> module_test.some_var
    'makohira'
    >>> module_test.hello('Bob')
    hello  Bob
    >>> module_test.thanks('Bob')
    thanks  Bob

import文には大きく分けて2つの書き方がある。

    1. import モジュール名
    2. from モジュール名 import 使用したい変数や関数やクラス名

asを使うと別名も使える。

    1. import モジュール名 as 別名
    2. from モジュール名 import 使用したい変数や関数やクラス名 as 別名
    >>> import module_test as p
    >>> p.hello('Bob')
    hello  Bob

    >>> from module_test import some_var
    >>> some_var
    'makohira'

Pythonはsys.pathに格納されている順番にモジュールを探す。

    >>> import sys
    >>> sys.path
    ['', '/Library/Frameworks/Python.framework/Versions/3.4/lib/python34.zip',.......(省略)]

パッケージ

パッケージを使うとモジュールを階層化して管理できる。
「__init__.py」ファイル(中身は空で良い)が置かれたディレクトリがPythonのパッケージとして認識される。
例として次のような構成でファイルを作ります。

.
├── p1
│   ├── __init__.py
│   └── module.py
├── p2
│   ├── __init__.py
│   └── module.py
└── package_test.py

__init__.pyは空ファイルです。

# p1/module.py

def say_hi():
    print("Hi, I'm in p1.")



# p2/module.py

def say_hi():
    print("Hi, I'm in p2.")



# package_test.py

import p1.module as m1
import p2.module as m2

m1.say_hi()
m2.say_hi()

実行してみる。

    $ python package_test.py 
    Hi, I'm in p1.
    Hi, I'm in p2.

Python標準ライブラリ

Pythonにはかなり大規模な標準ライブラリが用意されている。
そのままだとコア言語部分がとても大きくなってしまうので、必要な時にインポートして利用するしくみになっている。

勉強に使っている本はオライリーの「入門Python3」


Comments