次のディレクトリ構造を持つpythonアプリケーションがあります。
src
|
+---- main
|
+---- util
|
+---- gen_py
|
+---- lib
パッケージmainには、MyServer.pyという名前のpythonモジュールがあり、次のようなimportステートメントがあります。
from gen_py.lib import MyService
このステートメントを機能させるために、MyServer.pyの先頭に次の行を配置しました。
import sys
sys.path.append('../gen_py/lib')
ターミナルでMyServer.pyを実行すると、次のエラーが表示されます。
ImportError:gen_py.libというモジュールはありません
ここで何が欠けていますか?
sys.path
の変更は、現在の作業ディレクトリが常にmain/
にあると想定しています。これはそうではありません。代わりに、親ディレクトリをsys.path
に追加するだけです:
import sys
import os.path
sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
import gen_py.lib
ファイル__init__.py
をgen_pyおよびlibに含めることを忘れないでください。そうしないと、Pythonモジュールとして認識されません。
Pythonモジュールのインポートを機能させるには、パスに「gen_py/lib」ではなく「src」が必要です。
import gen_py.lib
などのインポートを処理する場合、モジュールgen_py
を探し、次にサブモジュールlib
を探します。
モジュールgen_py
は "../gen_py/lib"にはないので( ".."になります)、追加したパスはインポートプロセスに役立ちません。
実行元に応じて、「src」フォルダーに相対パスを追加してみてください。おそらくそれはsys.path.append('..')
です。 python main/MyServer.py
などの相対パスを使用して、srcフォルダー内で直接スクリプトを実行することもできます。
from ..gen_py.lib import MyService
または
from main.gen_py.lib import MyService
各ディレクトリに(少なくとも空の)__init__.py
ファイルがあることを確認してください。
これは、パッケージをビルドしていて、インポートでエラーを見つけている場合です。答えは、パッケージをpythonパスに追加することでも、プログラムで実行することでもありません(モジュールがインストールされ、コマンドで再度追加した場合はどうでしょうか)。それは悪い方法です。
正しいことは:1)virtualenv pyvenv-3.4または同様のものを使用する2)開発モードを有効にする-$ python setup.py developer
Pythonにこれらのディレクトリにパッケージが含まれていることを知らせる__init__.py
を含めるようにしてください
ルートプロジェクトディレクトリがsys.path出力で表示されていることを確認します。そうでない場合は、ルートプロジェクトディレクトリのパスをsys.pathに追加してください。