[Python #10] 自作関数のimport

こんにちは。H.Iです。

今回は、自作した関数をimport文で呼び出して使う方法を簡単に紹介したいと思います。

自作関数のimportの仕方は大きく分けて2つあります。

同じディレクトリからのimport」と「site-packagesからのimport」です。

この2つの方法について説明していきます。

その方法についても書いていこうと思います。

環境

OS : Windows10 Pro
Python : 3.8.12
jupyter-notebook : 6.4.6

使う関数

今回importする関数の例として使うのは、過去の投稿([Python #8] API / Web API)で最後に示した、国土地理院APIを使ってジオコーディングするための関数です。

この関数だけが記述されたスクリプトを、「gsi_api.py」とします。

尚、このブログではjupyter-notebook上でimportして関数を使っていく様子を紹介していきますが、.py拡張子のスクリプト内でimportする場合も同様に使うことができます。

同じディレクトリからのimport

まずは一番簡単な方法です。

jupyter-notebookを実行している(.ipynbのある)ディレクトリと同じディレクトリに「gsi_api.py」を入れます。

図1. ディレクトリ例

jupyter-notebookで使ってみます。

図2. jupyter-notebookでの実行例

解説

import

import [自作関数のファイル名から.pyを除いた文字列]

今回の場合は、自作関数のファイル名が「gsi_api.py」だったので、importするのは「gsi_api」になります。

「自作関数のファイル名から.pyを除いた文字列」というのは、「モジュール名」に当たるものなので、事項ではこのように呼びます。

関数の使用

[返り値] = [モジュール名].[関数名]([引数])

今回の場合は、上述のようにまずモジュール名が「gsi_api」です。

そして、gsi_api.pyの中の「geocoding」という名前の関数を呼び出しています。なお、この関数の引数は住所の文字列なので、「address」という変数を定義して引数として入れています。

返り値は、緯度経度なので「lat」, 「lon」という変数にそれぞれ格納しています。

site-packagesからのimport

続いて、実行するスクリプトのディレクトリに依存せずにどこからでも自作関数をimportできるようにする方法を紹介します。

ライブラリのディレクトリの用意

まずはライブラリとして登録するためのディレクトリを用意します。

用意する場所は、Pythonがインストールされているディレクトリ内の「lib/site-packages」というディレクトリです。

具体例として、私はWindowsにAnacondaでインストールしているのでsite-packagesのパスは下記のようになっています。

C:\Users\[ユーザー名]\anaconda3\Lib\site-packages

OSやPythonのインストール方法によってパスは変わると思うので、ご自身の環境に合ったパスの調べ方を検索してみてください。

上記のsite-packagesディレクトリ内に、「GSI」という名前のディレクトリを作ります。

最終的なパスは以下のようになります。

C:\Users\[ユーザー名]\anaconda3\Lib\site-packages/GSI

__init__.pyの用意

先ほど作成した「GSI」ディレクトリ内に、「__init__.py」というファイルを作成してください。

とりあえずは空で構いません。

これ以降の手順は二通りあるので、ここからは方法①・②として紹介していきます。

方法① __init__.pyが空のパターン

まずは「__init__.py」に何も記述されていないパターンです。

GSI」ディレクトリの中に「gsi_api.py」入れます。

図3. site-packages/GSIのディレクトリ例

jupyter-notebookで使ってみます。

図4. jupute-notebookでの実行例

解説

import

from [ライブラリのディレクトリ名] import [自作関数のファイル名から.pyを除いた文字列]

今回の場合は、[ライブラリのディレクトリ名]が「GSI」です。

この[ライブラリのディレクトリ名]は、「ライブラリ名」に当たるものなので、事項ではこのように呼びます。

また、自作関数のファイル名は「gsi_api.py」であり、[自作関数のファイル名から.pyを除いた文字列]は「gsi_api」です。

「自作関数のファイル名から.pyを除いた文字列」というのは、「モジュール名」に当たるものなので、事項ではこのように呼びます。

関数の使用

[返り値] = [モジュール名].[関数名]([引数])

今回の場合は、上述のようにまずモジュール名が「gsi_api」です。

そして、gsi_api.pyの中の「geocoding」という名前の関数を呼び出しています。なお、この関数の引数は住所の文字列なので、「address」という変数を定義して引数として入れています。

返り値は、緯度経度なので「lat」, 「lon」という変数にそれぞれ格納しています。

別の記述方法

ちなみに、この方法①においては下記のような記述でimportと関数の使用を行うこともできます。

import [ライブラリ名].[モジュール名]
[返り値] = [ライブラリ名].[モジュール名].[関数名]([引数])

方法② __init__.pyの中に関数がある場合

次に「__init__.py」の中に関数を記述しているパターンです。

GSI」ディレクトリの中の「gsi_api.py」を「__init__.py」に名前を変更しておきます。

図5. site-packages/GSIのディレクトリ例

画像を見て分かるように、「gsi_api.py」はなくなり、「__init__.py」だけになっています。

jupyter-notebookで使ってみます。

図6. jupyter-notebookでの実行例

解説

import

import [ライブラリのディレクトリ名]

今回の場合は、[ライブラリのディレクトリ名]が「GSI」です。

この[ライブラリのディレクトリ名]は、「ライブラリ名」に当たるものなので、事項ではこのように呼びます。

関数の使用

[返り値] = [ライブラリ名].[関数名]([引数])

今回の場合は、上述のようにまずライブラリ名が「GSI」です。

そして、__init__.pyの中の「geocoding」という名前の関数を呼び出しています。なお、この関数の引数は住所の文字列なので、「address」という変数を定義して引数として入れています。

返り値は、緯度経度なので「lat」, 「lon」という変数にそれぞれ格納しています。

おわりに

いかがだったでしょうか。自作関数を汎用性を持たせて使いたいときは「site-packagesからのimport」を使うと良いかと思います。

よく使う関数などはこのようにsite-packagesにライブラリとして入れてみてはいかがでしょうか。

今回紹介した方法以外にも自作関数をうまく使う方法はあると思うので、興味がある方は調べてみてください。

参考

Python の __init__.py とは何なのか

Pythonロゴの提供元