質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

723閲覧

Pythonのディレクトリ構成によるimportできない問題

sequelanonymous

総合スコア123

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/05/31 12:59

編集2019/05/31 13:06

以下で実行したときにexecute.pyでimport しているはずのconfigができていません。
(以下のファイルのfrom .execute import functionの箇所)
これは、ディレクトリ構成を変える必要がありそうな気がしていますが、どう変えるのがベストか迷っています。
何か、アイデアありましたら教えてくれた頂けませんでしょうか?

EXPORT FLASK=run.py flask run

エラー

python

1ModuleNotFoundError: No module named 'config' 2
. ├── Dockerfile ├── Makefile ├── README.md ├── __init__.py ├── config │   ├── __init__.py │   └── base.py ├── config.py ├── execute.py ├── requirements.txt ├── run.py └── test.sh

init.py

from flask import Flask from .config import config from .execute import function app = Flask(__name__) def create_app(): app = Flask(__name__) app.config.from_object(config['base']) @app.route('/v1/get_texts/<key_name>/<file_name>', methods=['GET']) def get_texts(key_name, file_name): ... ... return function(line) return app ...

run.py

python

1from . import create_app 2 3 4app = create_app() 5if __name__ == '__main__': 6 app.run(host='127.0.0.1', port=8080, debug=True)

execute.py

python

1... 2from config.base import Config 3... 4...

config.py/init.py

python

1from . import base 2 3 4config = { 5 'base': base.Config 6} 7

config/base.py

python

1class Config: 2 ... 3 ...

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

プロジェクトディレクトリーがparent/projectにあると仮定し、そこへ__init__.pyを置いてPythonのレギュラーパッケージとなるようにしたうえで、起動の仕方によってモジュール検索パス(sys.path)がどうなるかを調べてみますと

(1) python3 run.py
sys.path == ['parent/project', ...]

(2) export FLASK=run.py; flask run
sys.path == ['parent', ... ]

のように違いが出てくるようです。質問者さんは(1)のようないわゆるpythonスクリプトの起動をイメージして
from config.base ...
と記述しておられると思いますが、(2)の結果からflaskによる起動では
from .config.base ...
と書かねばならないようです。

自分はflaskについて暗いので本当のところはわかりませんが、少なくとも(2)の起動のしかたをする場合はプロジェクトのトップレベルを「一つのレギュラーパッケージとして記述する」スタイルを取るべきなのだと思います。

投稿2019/06/01 01:49

KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sequelanonymous

2019/06/01 06:13

なるほど、気づきませんでした。ありがとうございます。 ちょっと、(1)と(2)の違いがわからなくなってきました。from .config.base の . の意味は、configディレクトリのある階層のことを言っていると理解していますが、同じ認識でしょうか? つまり、これは、from project.config.base import ...と同義でprojectの部分を省略している、という理解でいました。しかし、省略しない書き方だとエラーがでてしまい、なんか違いがあるのかなと思ったり。 もう一点、ご意見お伺いさせてください。 本当は、省略せずにどのモジュールも全て絶対フルパスで統一して書きたいと考えています。 そういう場合は、(1)と(2)どちらが適していると思いますか?どこの階層にいても絶対フルパスでimportできるようなディレクトリ構成を日々模索していますが、たどり着けずにいます。。。 ご意見頂きますと助かります。
KSwordOfHaste

2019/06/01 06:39

pythonのモジュールとパッケージの仕様については自分も充分理解しているとは言えないため下手にコメントすると間違いを言いそうです。 自分はPythonのリファレンスのimportシステムのところと https://www.lifewithpython.com/2018/05/python-difference-between-package-and-module.html この記事を両方熟読すると理解が深まるような気がしてます。 > どこの階層にいても絶対フルパスでimportできる 個人的にはその方法論よりレギュラーパッケージ、つまり__init__.pyを持つパッケージディレクトリーを用いて相対パスでプロジェクトを構成した方がよい気がします。 絶対パスでimportしたいというのが「今書いているプロジェクトとは独立したモジュール」ということなら、PYTHONPATHに自分用のモジュールのトップディレクトリー(例えば~/mypymodulesとか)を設定しておき、そのディレクトリー配下に自前のモジュール群を整理して入れておくと実質上望むことが可能ではないかとも思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問