web-dev-qa-db-ja.com

ImportError:モジュールの名前がありません-Python

次のディレクトリ構造を持つ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というモジュールはありません

ここで何が欠けていますか?

66
F. Aydemir

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モジュールとして認識されません。

78
phihag

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フォルダー内で直接スクリプトを実行することもできます。

6
lunixbochs
from ..gen_py.lib import MyService

または

from main.gen_py.lib import MyService

各ディレクトリに(少なくとも空の)__init__.pyファイルがあることを確認してください。

5
JBernardo

これは、パッケージをビルドしていて、インポートでエラーを見つけている場合です。答えは、パッケージをpythonパスに追加することでも、プログラムで実行することでもありません(モジュールがインストールされ、コマンドで再度追加した場合はどうでしょうか)。それは悪い方法です。

正しいことは:1)virtualenv pyvenv-3.4または同様のものを使用する2)開発モードを有効にする-$ python setup.py developer

3
harishkashyap

Pythonにこれらのディレクトリにパッケージが含まれていることを知らせる__init__.pyを含めるようにしてください

3
aychen0110

ルートプロジェクトディレクトリがsys.path出力で表示されていることを確認します。そうでない場合は、ルートプロジェクトディレクトリのパスをsys.pathに追加してください。

0
Raghav salotra