Python Language
モジュールのインポート
サーチ…
構文
- import module_name
- import module_name.submodule_name
- from module_name import *
- from module_name import submodule_name [、 クラス名 、 関数名 、...など]
- module_nameからimport some_name new_name
- module_name.submodule_nameからimport class_name [、 function_name 、...など]
備考
モジュールをインポートすると、Pythonはこのモジュールのすべてのトップレベルコードを評価し、モジュールに含まれるすべての関数、クラス、および変数を学習します。あなたのモジュールを別の場所にインポートしたい場合は、トップレベルのコードに注意し、モジュールがインポートされたときに実行させたくない場合はif __name__ == '__main__':
カプセル化してください。
モジュールのインポート
import
ステートメントを使用します。
>>> import random
>>> print(random.randint(1, 10))
4
import module
はimport module
をインポートし、 module.name
構文を使用して、そのオブジェクト(値、関数、クラスなど)を参照できるようにします。上記の例では、 randint
関数を含むrandom
モジュールがインポートされてrandint
ます。 random
をインポートすることで、 randint
でrandom.randint
呼び出すことができます。
モジュールをインポートして別の名前に割り当てることができます。
>>> import random as rn
>>> print(rn.randint(1, 10))
4
あなたのpythonファイルmain.py
がcustom.py
と同じフォルダにある場合。次のようにインポートすることができます:
import custom
モジュールから関数をインポートすることもできます:
>>> from math import sin
>>> sin(1)
0.8414709848078965
特定の関数をより深くモジュールにインポートするには、ドット演算子をimport
キーワードの左側でのみ使用します。
from urllib.request import urlopen
Pythonでは、関数をトップレベルから呼び出す2つの方法があります。 1つはimport
あり、もう1つはfrom
です。名前の衝突の可能性があるときは、 import
を使用する必要があります。 hello.py
ファイルとworld.py
ファイルにfunctionという名前の同じ関数があるとしfunction
。 import
ステートメントはうまくいくでしょう。
from hello import function
from world import function
function() #world's function will be invoked. Not hello's
一般的に、 import
は名前空間を提供します。
import hello
import world
hello.function() # exclusively hello's function will be invoked
world.function() # exclusively world's function will be invoked
あなたは十分に確信している場合でも、プロジェクト全体で使用する必要があり、同じ関数名を持つ方法はありませんfrom
ステートメントは、
同じ行に複数のインポートを行うことができます。
>>> # Multiple modules
>>> import time, sockets, random
>>> # Multiple functions
>>> from math import sin, cos, tan
>>> # Multiple constants
>>> from math import pi, e
>>> print(pi)
3.141592653589793
>>> print(cos(45))
0.5253219888177297
>>> print(time.time())
1482807222.7240417
上記のキーワードと構文を組み合わせて使用することもできます。
>>> from urllib.request import urlopen as geturl, pathname2url as path2url, getproxies
>>> from math import factorial as fact, gamma, atan as arctan
>>> import random.randint, time, sys
>>> print(time.time())
1482807222.7240417
>>> print(arctan(60))
1.554131203080956
>>> filepath = "/dogs/jumping poodle (december).png"
>>> print(path2url(filepath))
/dogs/jumping%20poodle%20%28december%29.png
モジュールからの特定の名前のインポート
完全なモジュールをインポートする代わりに、指定された名前だけをインポートすることができます。
from random import randint # Syntax "from MODULENAME import NAME1[, NAME2[, ...]]"
print(randint(1, 10)) # Out: 5
Pythonインタプリタはどのリソースから関数またはクラスをimport randint
すべきかを知っていなければならimport randint
、また、 import randint
は関数またはクラス自体を指定するため、 from random
import randint
必要です。
下の別の例(上記と同様):
from math import pi
print(pi) # Out: 3.14159265359
次の例では、モジュールをインポートしていないため、エラーが発生します。
random.randrange(1, 10) # works only if "import random" has been run before
出力:
NameError: name 'random' is not defined
Pythonインタプリタは、あなたがrandom
何を意味するのか理解していません。このサンプルにimport random
を追加して宣言する必要があります:
import random
random.randrange(1, 10)
モジュールからすべての名前をインポートする
from module_name import *
例えば:
from math import *
sqrt(2) # instead of math.sqrt(2)
ceil(2.7) # instead of math.ceil(2.7)
これにより、 math
モジュールで定義されているすべての名前がアンダースコアで始まる名前以外のグローバル名前空間にインポートされます(これは、ライターが内部使用のみであると感じることを示しています)。
警告 :同じ名前の関数がすでに定義またはインポートされている場合は、 上書きされます 。ほとんどの場合from math import sqrt, ceil
特定の名前のみをfrom math import sqrt, ceil
することが推奨されます 。
def sqrt(num):
print("I don't know what's the square root of {}.".format(num))
sqrt(4)
# Output: I don't know what's the square root of 4.
from math import *
sqrt(4)
# Output: 2.0
スター付きのインポートは、モジュールレベルでのみ許可されます。クラスまたは関数定義でそれらを実行しようとすると、 SyntaxError
ます。
def f():
from math import *
そして
class A:
from math import *
どちらも失敗する:
SyntaxError: import * only allowed at module level
__all__特殊変数
モジュールには、 __all__
という名前の特別な変数があり、 from mymodule import *
使用from mymodule import *
ときにどの変数をインポートするかを制限できます。
与えられたモジュール:
# mymodule.py
__all__ = ['imported_by_star']
imported_by_star = 42
not_imported_by_star = 21
imported_by_star
れたfrom mymodule import *
使用from mymodule import *
:
>>> from mymodule import *
>>> imported_by_star
42
>>> not_imported_by_star
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'not_imported_by_star' is not defined
ただし、 not_imported_by_star
は明示的にインポートできます:
>>> from mymodule import not_imported_by_star
>>> not_imported_by_star
21
プログラムによるインポート
関数呼び出しを通してモジュールをインポートするには、 importlib
モジュール(バージョン2.7以降のPythonに含まれています)を使用します。
import importlib
random = importlib.import_module("random")
importlib.import_module()
関数はパッケージのサブモジュールも直接インポートします:
collections_abc = importlib.import_module("collections.abc")
古いバージョンのPythonでは、 imp
モジュールを使用してください。
imp.find_module
およびimp.load_module
関数を使用して、プログラムによるインポートを実行します。
import imp, sys
def import_module(name):
fp, pathname, description = imp.find_module(name)
try:
return imp.load_module(name, fp, pathname, description)
finally:
if fp:
fp.close()
プログラムでモジュールをインポートするために__import__()
を使用しないでください! sys.modules
、 fromlist
引数など、 importlib.import_module()
があなたのために扱うものを見落としやすい微妙な詳細があります。
任意のファイルシステムの場所からモジュールをインポートする
既にPython標準ライブラリやサイドパッケージとして組み込みモジュールとして存在していないモジュールをインポートする場合は、モジュールが見つかったディレクトリへのパスをsys.path
追加することでこれを行うことができますsys.path
。これは、複数のPython環境がホスト上に存在する場合に便利です。
import sys
sys.path.append("/path/to/directory/containing/your/module")
import mymodule
モジュール自体へのパスではなく、 mymodule
が見つかったディレクトリへのパスを追加することが重要です。
PEP8の輸入規則
いくつかのPEP8スタイルの輸入ガイドラインが推奨されています。
輸入は別々の行にする必要があります:
from math import sqrt, ceil # Not recommended from math import sqrt # Recommended from math import ceil
モジュールの上部に次のようにインポートを注文します。
- 標準ライブラリのインポート
- 関連する第三者輸入
- ローカルアプリケーション/ライブラリ固有のインポート
ワイルドカードのインポートは、現在のネームスペース内の名前に混乱を招くので避けてください。
from module import *
行うと、コード内の特定の名前がmodule
かどうかは不明です。これはfrom module import *
-type文from module import *
複数のfrom module import *
がある場合には二重に当てはまります。相対インポートを使用しないでください。代わりに明示的なインポートを使用してください。
サブモジュールのインポート
from module.submodule import function
これはmodule.submodule
からfunction
をmodule.submodule
ます。
__import __()関数
__import__()
関数を使用して、実行時にのみ名前が分かっているモジュールをインポートすることができます
if user_input == "os":
os = __import__("os")
# equivalent to import os
この関数を使用して、モジュールへのファイルパスを指定することもできます
mod = __import__(r"C:/path/to/file/anywhere/on/computer/module.py")
モジュールの再インポート
インタラクティブインタプリタを使用する場合、モジュールをリロードすることができます。これは、モジュールを編集していて最新のバージョンをインポートしたい場合や、既存のモジュールの要素を猿で修正して変更を元に戻したい場合に便利です。
モジュールを再度import
して元に戻すことはできません 。
import math
math.pi = 3
print(math.pi) # 3
import math
print(math.pi) # 3
これは、インタープリターがインポートするすべてのモジュールを登録するためです。モジュールを再インポートしようとすると、インタープリタはそれをレジスタに入れて何もしません。再インポートする難しい方法は、レジスタから対応する項目を削除した後にimport
を使用することです。
print(math.pi) # 3
import sys
if 'math' in sys.modules: # Is the ``math`` module in the register?
del sys.modules['math'] # If so, remove it.
import math
print(math.pi) # 3.141592653589793
しかし、もっと簡単で簡単な方法があります。
Python 2
reload
関数を使用します。
import math
math.pi = 3
print(math.pi) # 3
reload(math)
print(math.pi) # 3.141592653589793
Python 3
reload
関数がimportlib
移動しました:
import math
math.pi = 3
print(math.pi) # 3
from importlib import reload
reload(math)
print(math.pi) # 3.141592653589793