私はファイルシステム上のプロジェクトのルートパスにディレクトリを作成するFlask拡張機能を開発中です。Flaskアプリケーションのルートパスを取得
たちは
/project
/app
/tests
/my_folder
manage.py
このディレクトリ構造を持っていると仮定しmy_folderは、テスト・ユーティリティで、/ testsディレクトリにあるテスト対象のアプリケーションをラップ拡張によって動的に作成する必要があります。しかし、私は自分の内線内でプロジェクトのルートパスを決定するのに苦労しています。今の
は、私は、実行ファイルからのパスを推測しようとしています:これは明らかに壊れdef root_path(self):
# Infer the root path from the run file in the project root (e.g. manage.py)
fn = getattr(sys.modules['__main__'], '__file__')
root_path = os.path.abspath(os.path.dirname(fn))
return root_path
を、すぐにテストが代わりにmanage.pyのIDE内から実行されます。私は単純にアプリケーションやテストのディレクトリに関連するプロジェクトのルートを推測することができますが、複数のアプリケーションが単一パッケージ内のサブパッケージとしてホストされている可能性があるため、これらのディレクトリの名前や構造については何も仮定したくありません。
このタイプの問題や、Flaskオブジェクトが提供するドキュメント化されていないメソッド(get_root_pathなど)のベストプラクティスがあるかどうかは疑問でした。
ありがとうございました!私の一行の解決策: 'root_path = os.path.sep.join(self.app.instance_path.split(os.path.sep)[: - 1])' – thyrel
@thyrelは完全にポイントを逃します。任意の種類のルートパスではなく 'app.instance_path'を使用します。本当にルートパスが必要な場合は、 'app.root_path'を使います。パスをインスタンスパスの上に置いておきたい場合は、 'os.path.join(app.instance_path、 '..')'を使います。 – davidism