回答:
相対インポートは、現在のスクリプト/パッケージを基準にしてパッケージをインポートするときに必ず発生します。
たとえば、次のツリーについて考えてみます。
mypkg
├── base.py
└── derived.py
今、あなたderived.pyはからの何かが必要ですbase.py。Python 2では、次のように実行できます(derived.py)。
from base import BaseThing
Python 3では、「相対」と「絶対」のどちらが必要かが明確ではないため、サポートされなくなりましたbase。言い換えればbase、システムにインストールされたという名前のPythonパッケージがあった場合、間違ったパッケージを取得することになります。
代わりに、パスと同様にモジュールの場所を明示的に指定する明示的なインポートを使用する必要があります。あなたderived.pyは次のようになります:
from .base import BaseThing
リーディング.は「baseモジュールディレクトリからインポート」と言っています。つまり、に.baseマッピングされ./base.pyます。
同様に、(へのマッピングを使用して)..ディレクトリ階層を上に行く接頭辞があり、次に2レベル上に行く()などの接頭辞があります。../..mod../mod.py...../../mod.py
ただし、上記の相対パスは、現在の作業ディレクトリderived.pyではなく、現在のモジュール()が存在するディレクトリに対する相対パスであることに注意してください。
@BrenBarnはすでにスターインポートのケースを説明しています。完全を期すために、私は同じことを言わなければなりません;)。
たとえば、いくつかのmath関数を使用する必要がありますが、それらは単一の関数でのみ使用します。Python 2では、あなたは半怠惰であることが許可されていました:
def sin_degrees(x):
from math import *
return sin(degrees(x))
Python 2ですでに警告がトリガーされていることに注意してください。
a.py:1: SyntaxWarning: import * only allowed at module level
def sin_degrees(x):
最新のPython 2コードでは、Python 3では次のいずれかを実行する必要があります。
def sin_degrees(x):
from math import sin, degrees
return sin(degrees(x))
または:
from math import *
def sin_degrees(x):
return sin(degrees(x))
相対的なインポートについては、ドキュメントを参照してください。相対インポートとは、絶対にではなく、モジュールの場所を基準にしてモジュールからインポートする場合ですsys.path。
に関してはimport *、Python 2は関数内でのスターのインポートを許可しました。例えば:
>>> def f():
... from math import *
... print sqrt
これについては、Python 2(少なくとも最近のバージョン)では警告が出されます。Python 3では、これは許可されなくなり、スターインポートはモジュールのトップレベルでのみ実行できます(関数またはクラス内ではできません)。
Python 2とPython 3の両方をサポートするには、以下のように明示的な相対インポートを使用します。それらは現在のモジュールに関連しています。2.5からサポートされています。
from .sister import foo
from . import brother
from ..aunt import bar
from .. import uncle
import .brotherPython 2と3の両方の構文が無効です
import ..uncle。修繕。ああ、私は何を考えていたのでしょう... Niと言う騎士に気を取られたのでしょう。