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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

1回答

6501閲覧

pythonのユーティリティモジュール同士でのimportが上手くいきません...

th1209

総合スコア40

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

1クリップ

投稿2016/08/11 07:07

いつもお世話になっております。
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文に関する良記事(以下のような観点について書いてあるもの)。

    1. ライブラリとして使う、モジュール間同士でimportを行う方法
    2. 下位のディレクトリから、上位ディレクトリに置いてあるライブラリをimportする方法
  • pythonのimport文を書く際のベストプラクティス

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

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

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

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

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

coco_bauer

2016/08/11 08:32

カレントフォルダーや実行しているPythonがあるフォルダー以外では、環境変数「PYTHONPATH」に列挙したフォルダとsys.pathに登録してあるフォルダからimportされます。 "lib/utilities/"をPYTHONPATHに付け加える、sys.pathに登録するのいずれかで解決しそうに思えます。 sys.pathに登録してあるフォルダ
th1209

2016/08/11 08:58

coco_bauerさん 教えて頂きありがとうございます。 そうですね、現在はimportが上手くいっていないので、各pythonファイルにsys.path.appendを行っている状態です。 環境変数PYTHONPATHについては知りませんでした...。 初回起動時に必ず呼ぶスクリプトに、上記環境変数の代入処理を仕込んで、各pythonスクリプトでimportするようにしようかと思います!
guest

回答1

0

私の知ってる範囲でのやり方なのでもっといい方法はあるかもしれませんが、

python 3では相対importがあるので、それを用います。

lib/bootstrap.py

python

1from .utilities import query_util 2from .utilities import config_util 3 4def bs_some(): 5 query_util.something()

lib/utilities/query_util.py

python

1from .datetime_util import get_unixtime_from_str 2def something(): 3 get_unixtime_from_str()

lib/utilities/datetime_util.py

python

1def get_unixtime_from_str(): 2 print('works!')

main.py

python

1from lib import bootstrap 2 3bootstrap.bs_some()

この場合 python3 main.py は上手く動作すると思います。

ただし、python3 lib/bootstrap.py は、相対importでエラーとなってしまいます。

SystemError: Parent module '' not loaded, cannot perform relative import

これを回避するには

python3 -m lib.bootstrap python3 -m lib.utilities.query_util

の様に実行してあげてください。

以下の様にしても一応回避はできますが、個人的にはこのやり方は使わないかなと感じてます。

lib/bootstrap.py

if __name__ == '__main__': from utilities import query_util from utilities import config_util else: from .utilities import query_util from .utilities import config_util

投稿2016/08/11 09:36

flied_onion

総合スコア2604

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問