ホームページ >バックエンド開発 >Python チュートリアル >モジュールをスクリプトとして実行するときに、Python パッケージで相対インポートを処理するにはどうすればよいですか?

モジュールをスクリプトとして実行するときに、Python パッケージで相対インポートを処理するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-29 15:25:11807ブラウズ

How to Handle Relative Imports in Python Packages When Running Modules as Scripts?

Python 3 の相対インポート

同じディレクトリ内の別のファイルから関数をインポートしようとする場合、from .mymodule import myfunction または from mymodule import myfunction を使用すると、エラーが発生します。その理由は、インポートされる関数を含むモジュールがパッケージ内にあるかどうかにあります。

相対インポートの使用

相対インポートは、モジュールがパッケージ内にある場合に機能します。パッケージを作成するには、モジュールが含まれるディレクトリに __init__.py ファイルが存在する必要があります。ただし、場合によってはモジュールをスクリプトとして実行できるようにすることも重要です。

コード構造

複数のモジュールとメイン スクリプトを含むパッケージの一般的なレイアウトは次のとおりです。以下:

  • main.py
  • mypackage/

    • __init__。 py
    • mymodule.py
    • myothermodule.py

内mymodule.py:

# Exported function
def as_int(a):
    return int(a)

# Test function for module  
def _test():
    assert as_int('1') == 1

if __name__ == '__main__':
    _test()

myothermodule.py 内:

# Import exported function from the mymodule
from .mymodule import as_int

# Exported function
def add(a, b):
    return as_int(a) + as_int(b)

# Test function for module  
def _test():
    assert add('1', '1') == 2

if __name__ == '__main__':
    _test()

main.py 内:

# Import exported function from myothermodule
from mypackage.myothermodule import add

def main():
    print(add('1', '1'))

if __name__ == '__main__':
    main()

コードの実行

main.py または mypackage/mymodule.py を実行すると、コードは問題なく実行されます。ただし、mypackage/myothermodule.py を実行しようとすると、使用された相対インポート (.mymodule import as_int から) に関連するエラーが発生します。

代替アプローチ

これに対処するには、2 つの代替アプローチがあります。 :

  1. 絶対インポートを使用: 相対インポートを置き換えます完全なモジュール パスを指定して絶対インポートを使用してインポートします: from mypackage.mymodule import as_int。ただし、これには、パッケージの親ディレクトリが PYTHONPATH に追加されている必要があります。
  2. -m オプションを使用します: モジュールが正しく実行されることを確認しながら絶対インポートの使用を回避するには、- を使用します。 Python の m オプション: python3 -m mypackage.myothermodule。この方法では、パッケージの親ディレクトリからコマンドを実行する必要があります。

以上がモジュールをスクリプトとして実行するときに、Python パッケージで相対インポートを処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。