Select Language

AI Technology Community

4.1、Pythonモジュール及び導入方法

モジュールとは Python ファイルのことです。空の Python ファイルもモジュールと呼ぶことができます。多くの場合、Python ファイルには変数、関数などの内容が含まれており、これらの内容は他のコードから利用することができます。

モジュールを使用する最も簡単な方法は、「import モジュール名」です。以下では、現在のディレクトリに child.py というファイルを作成し、内容は以下の通りです:

書式設定コピー
""" this is the child module # ファイル child.py の内容
""" 
name = "child" # 変数を定義
def hello(): # 関数を定義
    print("hello from child")


このモジュールを操作してみましょう:

>>> import child # このモジュールをインポート
>>> child # child は現在モジュールです
<module 'child' from '/moduleDemo1/child.py'>
>>> child.__doc__ # このモジュールの __doc__ 属性、つまりモジュールの最初の文字列
' this is the child module\n'
>>> child.__file__ # モジュールのファイル情報
'/moduleDemo1/child.py'
>>> child.__name__ # モジュール名
'child'
>>> child.name # このモジュール内の name 変数にアクセス
'child'
>>> child.hello # hello を確認すると、関数であることがわかります
<function hello at 0x108fa3e18>
>>> child.hello() # hello() 関数を呼び出す
hello from child


基本的な使い方は、import でモジュールを指定し、そのファイルで定義された変数や関数などのリソースを使用することです。使用する際にはモジュール名を付けます。例えば、child.name はモジュール child の変数 name を表します。

あるファイルのすべての内容をインポートしたくない場合、例えば hello() 関数だけをインポートしたい場合は、以下の文を使用することができます:

from child import hello

これにより、child モジュールの hello() 関数が現在の名前空間にインポートされます。このとき、child.hello ではなく、hello を使用する必要があります。

>>> from child import hello>>> hello()hello from child

あるモジュールのリソースにアクセスするたびにモジュール名を付けたくない場合は、以下の方法を使用することができます:

from モジュール名 import *

これにより、指定されたモジュールの内容がすべて現在の名前空間にロードされるため、使用する際にはモジュール名を付ける必要がなくなります。

>>> from child import *
>>> hello
<function hello at 0x10eef8c80>
>>> hello()
hello from child
>>> name
'child'


この 2 つの方法を同時に使用すると、衝突が発生するでしょうか?答えはノーです。2 つのリソースが共存し、相互に影響を与えないことがわかります。

>>> import child # 2 つの方法を同時に使用
>>> from child import *
>>> id(child.name) # それらの id は異なります
4524178480
>>> id(name)
>>> id(name)
4530112248
>>> child.name
'child'
>>> name
'child'
>>> child.name = "new_name" # 一方を変更しても、もう一方には影響しません
>>> name
'child'


先ほど、現在のディレクトリにファイルを作成することを説明しましたが、なぜ現在のディレクトリでなければならないのでしょうか?他のディレクトリはダメでしょうか?答えはダメです。特定のディレクトリにあるファイルだけがインポートされるからです。これは、Shell の path と似ています。指定されたディレクトリにあるファイルだけが自動的に実行されます。ただし、Shell では絶対パスを使用して path ディレクトリにないプログラムを実行することができますが、Python ではそれができません。

では、どのパスにある Python ファイルがインポートできるかをどうやって知るのでしょうか?これは sys.path 変数で定義されています。

>>> import sys
>>> sys.path # これはリストで、各要素は検索パスを表します
['', # 現在のディレクトリ
'/anaconda3/lib/python37.zip',
'/anaconda3/lib/python3.7',
'/anaconda3/lib/python3.7/lib-dynload',
'/anaconda3/lib/python3.7/site-packages',
'/anaconda3/lib/python3.7/site-packages/aeosa']

sys.path はパスのリストであり、Python ファイルをこのリストのいずれかのパスに配置すれば、成功して import することができます。

ここで特に注意すべきは、最初の値が空の文字列で、現在のディレクトリを表していることです。これが、常に現在のディレクトリにある Python ファイルをインポートできる理由です。また、ここのディレクトリは最初のものを除いて、すべて絶対パスです。


post
  • 10

    item of content
Pythonにおいて、ディレクトリとファイルは非常に重要で、異なるファイルでは同じ関数や変数を定義しても衝突が起こりません。これはJavaに似ており、CやC++とは明らかに異なります。Pythonはソースコードのレベルでネームスペースを定義していないため、ファイルとパスがimport文と共にネームスペースの役割を果たします。
異なるPythonファイルは異なるモジュールに対応し、同じディレクトリ内の複数のPythonファイルの集合が1つのパッケージとなります。
この章では、読者にPythonのモジュールとパッケージの概念と定義を説明し、合わせてサードパーティのPythonパッケージの様々なインストール方法と使用法を紹介します。