web-dev-qa-db-ja.com

組み込みモジュールと同じ名前のモジュールをインポートしようとすると、インポートエラーが発生する

組み込みモジュールと競合するモジュールがあります。たとえば、myapp.emailで定義されているmyapp/email.pyモジュール。

コードのどこでも問題なくmyapp.emailを参照できます。ただし、メールモジュールから組み込みのメールモジュールを参照する必要があります。

# myapp/email.py
from email import message_from_string

myapp.emailにはmessage_from_stringメソッドがないため、自分自身を検出するだけなので、ImportErrorが発生します。 import emailを試してみると、email.message_from_stringで同じ問題が発生します。

Pythonでこれを行うためのネイティブサポートはありますか、それとも「メール」モジュールの名前をより具体的な名前に変更する必要がありますか?

67
Cory

この問題に対処する 絶対および相対インポート についてお読みください。使用する:

from __future__ import absolute_import

これを使用すると、装飾されていないパッケージ名は常に最上位パッケージを参照します。次に、相対的なインポート(from .email import ...)独自のパッケージにアクセスします。

注:上記のfrom ...行は、2.x Python .pyファイルはimport ...使用している行。 Python 3.xでは、これはデフォルトの動作であるため、必要ありません。

93
Greg Hewgill