web-dev-qa-db-ja.com

Python:含まれるパッケージをインポートする

パッケージ内にあるモジュールでは、そのパッケージの__init__.py内で定義された関数を使用する必要があります。パッケージ内にあるモジュール内にパッケージをインポートするにはどうすればよいので、その機能を使用できますか?

モジュール内に__init__をインポートしてもパッケージはインポートされませんが、代わりに__init__という名前のモジュールがインポートされ、異なる名前の2つのコピーが作成されます...

これを行うPythonの方法はありますか?

57
guy

また、Python 2.5以降では、相対的なインポートが可能です。例:

from . import foo

http://docs.python.org/tutorial/modules.html#intra-package-references からの引用:


Python 2.5で始まり、上記の暗黙的な相対インポートに加えて、importステートメントのfrom module import name形式で明示的な相対インポートを記述できます。これらの明示的な相対インポートは、相対的なインポートに関係する現在のパッケージと親パッケージたとえば、周囲のモジュールから、以下を使用できます

from . import echo
from .. import formats
from ..filters import equalizer
43
Brian Clapper

これはあなたの質問に正確に答えるわけではありませんが、関数を__init__.pyファイルの外に移動し、そのパッケージ内の別のモジュールに移動することをお勧めします。その後、その関数を他のモジュールに簡単にインポートできます。必要に応じて、__init__.pyファイルにimport関数を追加して、その関数を(パッケージのインポート時に)インポートすることもできます。

23
mipadi

パッケージの名前がtestmodであるため、initファイルがtestmod/__init__.pyであり、パッケージ内のモジュールがsubmod.pyである場合、submod.pyファイル内から、次のことができるはずです。 import testmodと言い、testmodで定義されているものは何でも使います。

5
Eli Courtwright

私は状況が何であるか完全にはわかりませんが、これはあなたの「異なる名前」の問題を解決するかもしれません:

import __init__ as top
top.some_function()

または多分?:

from __init__ import some_function
some_function()
1
cdleary

Djangoでは、manage.pyファイルにはfrom Django.core.management import execute_managerがありますが、execute_managerはモジュールではありません。これは、managementディレクトリの__init__.pyモジュール内の関数です。

1
mikemike