web-dev-qa-db-ja.com

Pythonおよび__init__.pyでのモジュールのインポート

___init__.py_ファイルの機能について読んでいます。これらのモジュールをインポートできるように、モジュールを含むフォルダーに空の___init__.py_ファイルが必要であると言われています。しかし、PYTHONPATH(Windows 7の環境変数)にフォルダーパスを追加してみました。このフォルダーには___init__.py_ファイルが含まれていませんが、そのフォルダーからモジュールをインポートできます。 ___init__.py_がなくてもこれらのモジュールをインポートする方法を説明していただけますか?

おかげで、

宜しくお願いします

27
alwbtc

__init__.pyは、フォルダを パッケージ に変換します。これは、次のようなインポート文を持つことができるモジュールの一種の階層を作成するのに役立ちます。

import mymodule.cool.stuff

これはパッケージなしでは不可能です。

18
Björn Pollex

モジュールディレクトリにhaving _init_。pynot 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

もちろん、サブフォルダーの問題をこれに追加できます

9
user966588

ディレクトリ(フォルダー)に__init__.pyファイルが含まれている場合、そのファイルはパッケージになります。あなたが読んだと思っていたものは、あなたが見つけたように厳密には正しくありませんでした。パッケージは、それ自体がモジュールであるかのようにインポートでき、__init__.py内のコードはすべて実行されますが、多くの場合は空です。パッケージは、複数のモジュールをグループ化する方法であり、以下を使用してそれらをロードできます。

import package-name.module-name

パッケージは入れ子にすることもでき、多くの場合は入れ子になります。多くの例については、Pythonソフトウェアディレクトリの下のLibディレクトリを参照してください。

9
cdarke

はい、これは機能します。空の__init__.pyファイルの理由は、モジュールを含むフォルダーとしてサブフォルダーをマークするためです。

したがって、PYTHONPATH内のフォルダーにはモジュールを含めることができますが、それらのフォルダーのサブフォルダーには、それらからモジュールをインポートできるように__init__.pyファイルが含まれている必要があります。

6
quamrana