Pythonで「ImportError:No module named…」エラーを修正する方法


114

このImportErrorエラーを修正する正しい方法は何ですか?

次のディレクトリ構造があります。

/home/bodacydo
/home/bodacydo/work
/home/bodacydo/work/project
/home/bodacydo/work/project/programs
/home/bodacydo/work/project/foo

そして私はディレクトリにいます

/home/bodacydo/work/project

今タイプすると

python ./programs/my_python_program.py

私はすぐに得ます

ImportError: No module named foo.tasks

./programs/my_python_program.py次の行が含まれています。

from foo.tasks import my_function

なぜpythonが見つからないのか理解できません./foo/tasks.py-そこにあります。

私がPythonシェルからそれをすると、それはうまくいきます:

python
>>> from foo.tasks import my_function

python ./programs/my_python_program.pyスクリプトを介して呼び出す場合のみ機能しません。

回答:


119

Pythonは、現在のディレクトリをに追加するのではsys.pathなく、スクリプトがあるディレクトリを追加/home/bodacydo/work/projectします。sys.pathまたはに追加します$PYTHONPATH


9
では、ルートフォルダーにinit .py があることのポイントは何でしょうか。sys.pathまたはpythonpathのいずれかを編集する場合、何の役にも立たないようです。

11
@Editor:__init__.pyディレクトリが親であるか、sys.pathそれ自体がパッケージである場合にのみ、ディレクトリをパッケージとして扱う必要があることを示します。
Ignacio Vazquez-Abrams 2014年

3
さらに、フォルダーのアクセス許可を確認します。それが私の場合の問題でした。
SidJ 2016

15
現在のディレクトリをPythonパスに追加するには、export PYTHONPATH=`pwd`
次のコマンドを

1
どのような私のために働いたことはあなたの場合には、$ PYTHONPATHにプロジェクトの親ディレクトリを追加したことになります。/home/bodacydo/work... この答えを参照
maledr53

33

__init__.pyfooディレクトリに呼び出されるファイルはありますか?そうでない場合、pythonはfooをpythonパッケージとして認識しません。

詳細については、Pythonチュートリアルのパッケージに関するセクションを参照してください。


おかげで、はい、ありました__init__.py。今回の問題はでした$PYTHONPATH。イグナシオのソリューションは機能しました。
bodacydo 2010

1
Pythonがディレクトリをパッケージを含むものとして扱うようにするには、init .pyファイルが必要です。これは、文字列などの一般的な名前のディレクトリが、後でモジュール検索パスで発生する有効なモジュールを誤って非表示にしないようにするために行われます。最も単純なケースでは、init .pyは空のファイルにすることができます
パノフィッシュ

いつか私を救ってくれてありがとう。
cpu_meltdown 2017年

9

ステップバイステップのソリューションはここにあります:

  1. スクリプトを追加run.pyして/home/bodacydo/work/project、このようなおよび編集、それを:

    import programs.my_python_program
    programs.my_python_program.main()
    

    (のmain()同等のメソッドに置き換えますmy_python_program。)

  2. に行く /home/bodacydo/work/project
  3. 走る run.py

説明:PythonはPYTHONPATH に実行元のスクリプトのパスを追加するため、実行run.pyすると追加されます/home/bodacydo/work/project。そしてほらimport foo.tasks見られます。


8

ライブラリをPYTHONPATHに追加するためのソリューションの例。

  1. 〜/ .bashrcに次の行を追加するか、直接実行します。

    export PYTHONPATH="$PYTHONPATH:$HOME/.python"
  2. 次に、必要なライブラリを〜/ .pythonフォルダにリンクします。たとえば、

    ln -s /home/user/work/project/foo ~/.python/

6

より良い設定よりも修正がPYTHONPATH使用することですpython -m module.path

これは正しく設定されsys.path[0]、モジュールを実行するためのより信頼できる方法です。

私が持って迅速な過去記事他の回答者が述べてきたように、この問題についての理由、このためですpython path/to/file.pyプットpath/toの初めにPYTHONPATHsys.path)。


2

私の考えでは、fooフォルダはスタンドアロンのライブラリであると考える必要があります。それをLib\site-packagespythonインストール内のフォルダーに移動することを検討したい場合があります。そこでfoo.pthファイルを追加したいと思うかもしれません。

./programs/my_python_program.pyは次の行が含まれているため、ライブラリだとわかります。

from foo.tasks import my_function

したがって、それ./programsがの兄弟フォルダであることは問題ではありません./foo。次のmy_python_program.pyようなスクリプトとして実行されるのはこのためです。

python ./programs/my_python_program.py


0

インストール済みバージョンを使用しているときにこの問題が発生した場合は、を使用するときにsetup.py、モジュールが中に含まれていることを確認してくださいpackages

setup(name='Your program',
    version='0.7.0',
    description='Your desccription',
    packages=['foo', 'foo.bar'], # add `foo.bar` here
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.