いつもお世話になっております。
pythonのimport文について理解ができず、困っております。
以下にフォルダ構成や、どんなエラーが出るかを記載します。
pythonに詳しい方、是非ご助言いただけないでしょうか...?
ユースケース
社内用のpythonスクリプトを作成しており、
どのスクリプトからでも使われるような、
ユーティリティモジュール群を、複数ファイルに分割して作成しています。
このユーティリティモジュール群を、
ユーティリティモジュール同士でimportしたり、
別スクリプトからimportする際に、上手くいかずに困っています。
フォルダ構成
- 以下にフォルダ構成を示します。
- bootstrap.py は初期化用のスクリプトです。utilities以下のモジュールをimportします。
- utilitiesフォルダ以下のモジュール群は、相互にimportを行っています。
/lib ├ __init__.py ├ bootstrap.py └ /utilities ├ __init__.py ├ config_util.py ├ dataframe_util.py ├ datetime_util.py ├ env_util.py ├ file_util.py ├ http_util.py └ query_util.py
具体例とエラー
- bootstrap.py と各モジュールでは、冒頭で以下のようなimportを行っています。
python
1#bootstrap.pyの冒頭部分 2from utilities import query_util 3from utilities import config_util 4...
python
1#query_util.pyの冒頭部分 2from datetime_util import get_unixtime_from_str 3...
- 実行結果は以下のようになります。
#実行結果 python3 lib/utilities/query_util.py -> このように、各モジュールを単体で起動した場合は、特にエラーになりません python3 lib/bootstrap.py -> query_utilのimport時に、相対パス解決が上手くいかないのでエラーが発生します。 -> 実際のエラーを以下に示します。
#発生するエラー File "lib/bootstrap.py", line 61, in <module> from utilities import query_util File "/Applications/MAMP/htdocs/jupyter-to-td/lib/utilities/query_util.py", line 9, in <module> from datetime_util import get_unixtime_from_str ImportError: No module named 'datetime_util'
望んでいる状態
- bootstrap.pyや他スクリプトからユーティリティモジュールのimportを行った際に、エラーが出ないようにしたい。
- 各ユーティリティモジュールを単体で起動した場合にも、エラーにならないようにしたい。
- (色々なパターンを試しましたが、「bootstrapからは各モジュールがimport出来るようになったものの、今度は各モジュール単体起動がダメになったり」と、上手くいきませんでしたorz)
聞きたいこと
-
以下について知りたいです。
-
上記エラーを解決する方法。
-
python import文に関する良記事(以下のような観点について書いてあるもの)。
- ライブラリとして使う、モジュール間同士でimportを行う方法
- 下位のディレクトリから、上位ディレクトリに置いてあるライブラリをimportする方法
-
pythonのimport文を書く際のベストプラクティス