web-dev-qa-db-ja.com

Pythonの別のフォルダーからモジュールをインポートするにはどうすればよいですか?

私はこのような構造にしたいプロジェクトがあります:

myproject
  __init__.py
  api
    __init__.py
    api.py
  backend
    __init__.py
    backend.py
  models
    __init__.py
    some_model.py

ここで、api.pyとbackend.pyの両方にモジュールsome_model.pyをインポートします。これを適切に行うにはどうすればよいですか?私は試した

from models import some_model

しかし、「ModuleNotFoundError:No model named 'models'」で失敗します。私も試しました

from ..models import some_model

その後、「ValueError:最上位パッケージを超えて相対インポートを試行しました」と表示されました。ここで何が間違っていますか?サブディレクトリではない別のディレクトリからファイルをインポートするにはどうすればよいですか?

7
Gasp0de

まず、このimportステートメントのステートメント:

from models import some_model

名前空間を設定する必要があります:

# in myproject/backend/backend.py or myproject/api/api.py
from myproject.models import some_model

次に、myprojectを含むディレクトリを取得する必要があります。この/path/to/parentsys.pathリストに呼び出します。環境変数を設定することにより、これを一時的に行うことができます。

export PYTHONPATH=/path/to/parent

または、できれば、setup.pyファイルを記述してパッケージをインストールすることでそれを行うことができます。 PyPA パッケージガイドに従ってください。同じディレクトリ内からsetup.pyファイルを作成したら、これを実行してsys.pathの正しいエントリを設定します。

pip install --editable .
4
wim

残念ながら、Pythonは、ファイルがシステムパスにある場合にのみファイルを検索します。

Pythonのsysモジュールを使用して、Pythonの実行中にパスにディレクトリを追加し、一度Pythonの実行が停止すると、パスから削除します。

これを行うには:

import sys
sys.path.insert(0, '/path/to/application/app/folder')
import [file]

ただし、ファイルをインポートする前にsysをインポートし、ディレクトリパスを設定することが重要です。

幸運を!

ヨルダン。

0