___init__.py
_ファイルの機能について読んでいます。これらのモジュールをインポートできるように、モジュールを含むフォルダーに空の___init__.py
_ファイルが必要であると言われています。しかし、PYTHONPATH(Windows 7の環境変数)にフォルダーパスを追加してみました。このフォルダーには___init__.py
_ファイルが含まれていませんが、そのフォルダーからモジュールをインポートできます。 ___init__.py
_がなくてもこれらのモジュールをインポートする方法を説明していただけますか?
おかげで、
宜しくお願いします
__init__.py
は、フォルダを パッケージ に変換します。これは、次のようなインポート文を持つことができるモジュールの一種の階層を作成するのに役立ちます。
import mymodule.cool.stuff
これはパッケージなしでは不可能です。
モジュールディレクトリにhaving _init_。pyとnot haveの1つの違いは:
あなたが持っている__init__.py
(空白のもの)、次を使用してモジュールをインポートできます
from dirname import MyModule
しかししない _init_。pyを使用すると、モジュールまでのパスを追加しないと、モジュールをインポートできませんPYTHONPATHに。 この場合from dirname import MyModule
[〜#〜]失敗[〜#〜]、またはエラーを報告します。
#なしのディレクトリ/モジュールの構造_init_。py
[root@Machine python]# cd NoInitModule/
[root@Machine NoInitModule]# pwd
/python/NoInitModule
[root@Machine NoInitModule]# ls -l
total 4
-rw-r--r--. 1 root root 44 Jan 16 07:02 ModuleX.py
#_init_。pyを使用したディレクトリ/モジュールの構造
[root@Machine NoInitModule]# cd ../InitModule/
[root@Machine InitModule]# ls -l
total 4
-rw-r--r--. 1 root root 0 Jan 16 07:13 __init__.py
-rw-r--r--. 1 root root 49 Jan 16 07:12 ModuleY.py
[root@Machine InitModule]#
例:
#NO _init_。py、from dir import module statement-DOES N'T WORK
[root@Machine python]# cat impomod.py
from NoInitModule import ModuleX
ModuleX.printBye()
[root@Machine python]# python impomod.py
Traceback (most recent call last):
File "impomod.py", line 7, in <module>
from NoInitModule import ModuleX
ImportError: No module named NoInitModule
[root@Machine python]#
#NO _init_。py、インポートステートメント-機能しません
[root@Machine python]# vim impomod.py
[root@Machine python]# cat impomod.py
#from NoInitModule import ModuleX
import ModuleX
ModuleX.printBye()
[root@Machine python]# python impomod.py
Traceback (most recent call last):
File "impomod.py", line 8, in <module>
import ModuleX
ImportError: No module named ModuleX
[root@Machine python]#
#NO _init_。py、PYTHONPATHのINSERTパス、パス挿入後のモジュールステートメントのインポート-WORKS
[root@Machine python]# vim impomod.py
[root@Machine python]# cat impomod.py
import sys
sys.path.append('/python/NoInitModule')
print sys.path
import ModuleX
ModuleX.printBye()
[root@Machine python]# python impomod.py
Bye from Module X with no __init__.py
[root@Machine python]#
#HAVING _init_。py、パスのINSERTなし、dir import moduleステートメントから-WORKS
[root@Machine python]# cat impXmod.py
import sys
from InitModule import ModuleY
ModuleY.printSeeU()
[root@Machine python]#
[root@Machine python]# python impXmod.py
See you from Module Y having __init__.py
#HAVING _init_。py、パスのINSERTなし、インポートモジュールステートメント-動作しません
[root@Machine python]# vim impXmod.py
[root@Machine python]# cat impXmod.py
import sys
#from InitModule import ModuleY
import ModuleY
ModuleY.printSeeU()
[root@Machine python]# python impXmod.py
Traceback (most recent call last):
File "impXmod.py", line 3, in <module>
import ModuleY
ImportError: No module named ModuleY
もちろん、サブフォルダーの問題をこれに追加できます
ディレクトリ(フォルダー)に__init__.py
ファイルが含まれている場合、そのファイルはパッケージになります。あなたが読んだと思っていたものは、あなたが見つけたように厳密には正しくありませんでした。パッケージは、それ自体がモジュールであるかのようにインポートでき、__init__.py
内のコードはすべて実行されますが、多くの場合は空です。パッケージは、複数のモジュールをグループ化する方法であり、以下を使用してそれらをロードできます。
import package-name.module-name
パッケージは入れ子にすることもでき、多くの場合は入れ子になります。多くの例については、Pythonソフトウェアディレクトリの下のLibディレクトリを参照してください。
はい、これは機能します。空の__init__.py
ファイルの理由は、モジュールを含むフォルダーとしてサブフォルダーをマークするためです。
したがって、PYTHONPATH内のフォルダーにはモジュールを含めることができますが、それらのフォルダーのサブフォルダーには、それらからモジュールをインポートできるように__init__.py
ファイルが含まれている必要があります。