Pythonの非パッケージ問題で相対インポートを試みる
最近、パートナーのデバッグを手伝っているときに、パッケージの中から直接 .py ファイルを実行すると、次のようなエラーが報告されることに気づきました。
ValueError: Attempted relative import in non-package
.
これは、この.pyファイルを実行したときに、パッケージフォルダ内にあり、.pyフォルダに以下のようなものがあれば、それが原因だと判明しました。
from .インポート
from .インポート
相対的なimport文の場合、エラーが報告されます。
なぜなら
相対インポートでは、パッケージ階層におけるそのモジュールの位置を決定するために、モジュールのname属性を使用します。
つまり、pythonは各モジュールの
__name__
を実装する。
例えば、フォルダ構造として
package/
__init__.py
subpackage1/
__init__.py
moduleX.py
moduleA.py
そこで、moduleX モジュールをインポートするスクリプトを(このパッケージフォルダ外で、パッケージと同じ階層に作成した run.py などで)実行すると、moduleX の
__name__
は
.package.subpackage1.moduleX
moduleXは前の名前を取得するので
moduleX.py
は、相対 import 文を内部に持つことができます。
from ... import moduleA
また、moduleXが
.package.subpackage1.moduleX
は
__name__
属性がある場合に限ります。
package
がpythonインタプリタにパッケージとして認識されていること(例えば、パッケージの兄弟フォルダにあるrun.pyの実行が
import package.subpackage1.moduleX
といった感じです)。しかし、私が直接実行するすべての python スクリプトがトップレベルスクリプトとして扱われる場合、トップレベルスクリプトの
__name__
は自動的に
__main__
. そのため、もし私が
moduleA.py
スクリプトを実行すると、その
__name__
が設定されます。
__main__
で、pythonはそれをパッケージとして扱わないので、相対import文は機能しません。
相対インポートは、現在のモジュールの名前に基づいていることに注意してください。メインモジュールの名前は常に "__main__" であるため、Python アプリケーションのメインモジュールとして使用することを意図したモジュールは、常に絶対 import を使用する必要があります。
参考にしてください。
https://docs.python.org/3/tutorial/modules.html#intra-package-references
https://stackoverflow.com/questions/14132789/relative-imports-for-the-billionth-time#answer-14132912
関連
-
concat を使用して 2 つのデータフレームを結合する際のエラー
-
Python3.3継続行のアンダーインデントで、.の後に複数のスペースを入れて視覚的にインデントしています。
-
SyntaxError: 構文が無効です。
-
python 3.3.2 エラー。urllib2' という名前のモジュールがない ソリューション
-
pythonフレームワーク Scrapyエラー TypeError: 'float' object is not iterable Solve
-
pipenvとpyenvによる複数の独立したPython仮想開発環境の管理
-
[Pythonノート】spyderのClearコマンド
-
Pythonのタイトル。学生情報管理システム - アドバンス版 (GUI + MySQLデータベース)
-
TypeError: 'builtin_function_or_method' オブジェクトは反復可能ではありません。
-
解決策 UnicodeDecodeError: 'gbk' コーデックは、位置 21804 のバイト 0x8b をデコードできません: 不正なマルチバイト配列です。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Python: pyHook-1.5.1-cp37-cp37m-win_amd64.whl はこのプラットフォームでサポートされたホイールではありません。
-
AttributeError: モジュール 'tensorflow'に属性 'placeholder' がない問題
-
Python max()関数
-
Python27 PILソリューションという名前のモジュールがない
-
ImportError を解決します。pandas をインストールした後に 'pandas' という名前のモジュールがない。
-
scipyという名前のモジュールがない場合の解決策|エラー
-
Python Djangoプロジェクトログクエリシステム
-
パイソン] Python パイソンミニゲーム - 欲張りスネークアドベンチャー
-
python 1e-5とはどういう意味ですか?
-
tkinter モジュールを使った Python 倉庫番ゲーム