Pythonエラー“ ImportError:No module named”


452

Pythonはローカルディレクトリにインストールされます。

私のディレクトリツリーは次のようになります。

(local directory)/site-packages/toolkit/interface.py

私のコードはここにあります:

(local directory)/site-packages/toolkit/examples/mountain.py

この例を実行するには、を記述python mountain.pyし、コードに次のように記述します。

from toolkit.interface import interface

そして私はエラーを受け取ります:

Traceback (most recent call last):
  File "mountain.py", line 28, in ?
    from toolkit.interface import interface
ImportError: No module named toolkit.interface

私はすでにチェックsys.pathしており、そこにディレクトリがあり/site-packagesます。また、__init__.py.binこれがパッケージであることをPythonに示すために、toolkitフォルダーにファイルがあります。また__init__.py.bin、examplesディレクトリにもがあります。

ファイルがにあるときにPythonがファイルを見つけられない理由はわかりませんsys.path。何か案は?権限の問題でしょうか?実行権限が必要ですか?


3
Pythonからそのファイルへの読み取り権限があることを確認してください。参照:stackoverflow.com/a/20999950/1657225
cSn 2014年

1
これがパッケージであることをPyCharmに知らせるために、ディレクトリを必ず「リソースルート」としてマークしてください。
emmmphd 2017年

私の場合の問題は、新しくインストールされたモジュールへの許可がなかったということでした755。これはumask、マシン上に許可がなかった0027ためにモジュールが読み取られなかったことが原因でした。権限を追加すると問題が解決しました。インストール後にターゲットディレクトリの権限を確認する価値があります。othersreadread
anu 2017年

ブローURLに試してみてください。stackoverflow.com/questions/47887614/...
Rawan-25

たぶんローカルディレクトリ名はinterface (矛盾しています)。
Benyamin Jafari 2018

回答:


267

oripの投稿へのあなたのコメントに基づいて、私はこれが起こったと思います:

  1. __init__.pyWindowsで編集しました。
  2. Windowsエディターは、印刷されないもの、おそらくキャリッジリターン(Windowsの行末はCR / LF、UNIXではLFのみ)、またはCTRL-Z(Windowsのファイルの終わり)を追加しました。
  3. WinSCPを使用してファイルをUNIXボックスにコピーしました。
  4. WinSCPの考え:「これは基本的なテキストではないものがあります。バイナリデータを示すために.bin拡張子を付けます。」
  5. 欠落している__init__.py(現在はと呼ばれる__init__.py.bin)ことは、Pythonがツールキットをパッケージとして理解していないことを意味します。
  6. __init__.py適切なディレクトリに作成すると、すべてが機能します...?

50
また、python -c 'import sys; print sys.path 'が役立ちます。ユーザーがスキャンされていないパスにファイルを置いていることがあります。
mikebabcock

1
WinSCPが追加しなかった以外は、同じものを使用しています.bin
ユーザー

9
空の「__init__.py」がある場合、同じことが起こりますか?
Dietbacon

2
OMG、あなたが支配します!この私のストーリー:1. Windowsでinit .pyを編集しました2.スペースの代わりにタブを追加しました3.この投稿が見つかるまでたくさんグーグルします!;)
GBrian

1
私にとっての問題は、でインストールしpython driver.pyてから使用するべきだったときに使用しpython3 driver.pyていたことpip3でした。
Eric Wiener

72

する

(local directory)/site-packages/toolkit

持っている__init__.py

インポートでディレクトリをウォークスルーするには、すべてのディレクトリに__init__.pyファイルが必要です。


1
いい視点ね!備考:Python 3.3以降、パッケージ名と一致する名前を持つsys.path上のディレクトリはすべて認識されます。
PatrickT 2016年

1
これは相対パス参照にのみ必要ではないですか?なぜすべてのディレクトリにそれが必要なのですか?
Sonic Soul

56

LPTHWでこの演習を行ったとき、非常によく似たものに遭遇しました。呼び出し元のディレクトリにファイルがあることをPythonに認識させることはできませんでした。しかし、最終的にはそれを機能させることができました。私がしたこと、そして私が推奨することは、これを試すことです:

(注:最初の投稿から、* NIXベースのマシンを使用していて、コマンドラインから実行していると想定しているので、このアドバイスはそれに合わせています。Ubuntuを実行しているので、これは私がやったことです)

1)ディレクトリ(cd)を、ファイルがあるディレクトリののディレクトリに変更します。この場合、mountain.pyファイルを実行し、toolkit.interface.py別のディレクトリにあるモジュールを呼び出そうとしています。この場合、両方のファイルへのパスが含まれているディレクトリ(つまり、両方のファイルのパスが共有する最も近いディレクトリ)に移動します。この場合はtoolkitディレクトリです。

2)tookitディレクトリに入ったら、コマンドラインに次のコード行を入力します。

export PYTHONPATH=.

これはにあなたのPYTHONPATHを設定します「」、基本的にあなたのPYTHONPATHは、今あなたが、中に(そしてより多くのポイントに現在のディレクトリ内の任意と呼ばれるファイルを探しますことを意味しているサブディレクトリの枝あなたがしているディレクトリの。だから、ちょうどあなたの現在のディレクトリに見えますが、あるすべてのディレクトリではありません)現在のディレクトリ。

3)上記のステップでPYTHONPATHを設定した後、現在のディレクトリ(toolkitディレクトリ)からモジュールを実行します。Pythonは、指定したモジュールを見つけてロードするはずです。

お役に立てれば。私自身、これにかなり苛立っていました。


2
またはWindowsの場合set PYTHONPATH=.
cjbarth 14

これでうまくいきました。また、マシンを切り替えるたびに絶対パスに更新する必要があるため、完全にPYTHONPATHのフラストレーションが単純化されました。ありがとう、ありがとう、ありがとう。
the_e

41

* nixでは、PYTHONPATHが正しく構成されていることも確認してください。特に、次の形式になっていることを確認してください。

 .:/usr/local/lib/python

.:最初のを確認して、現在のディレクトリも検索できるようにします。)

バージョンによっては、他の場所にある場合もあります。

 .:/usr/lib/python
 .:/usr/lib/python2.6
 .:/usr/lib/python2.7 and etc.

6
それはまたしてもよい.:/usr/lib/python.:/usr/lib/python2.6.:/usr/lib/python2.7等バージョンに応じ
ニキータボルコフ

私の場合、モジュールは/usr/local/lib/python3.4/dist-packagesにありますが、ターミナル(ubuntu)でpython3と入力してインポートしようとすると、許可されません。存在しません。「ImportError:モジュールxは存在しません」
user65165

#!/usr/bin/pythonファイルの最後に追加することもできますよね?
Nearoo、2016年

1
@Nearooうまくいくとは思いません。さらに、通常、このシバンはファイルの先頭に追加されます。
Renaud

2
MacOSXでは、起動スクリプトにPYTHONPATH = / usr / local / lib / python2.7 / site-packagesを追加して修正しました。
Johan Snowgoose 2017

23

私は自分自身の問題を解決しました。そして、私は間違っていたものの要約と解決策を書きます:

ファイルは正確に呼び出す必要があります__init__.py。私の場合のように拡張子が異なる場合.py.bin、Pythonはディレクトリを移動できず、モジュールを見つけることができません。ファイルを編集するには、vinanoなどのLinuxエディターを使用する必要があります。。Windowsエディターを使用する場合、これはいくつかの隠し文字を書き込みます。

これに影響を与えていた別の問題は、ルートによって別のバージョンのPythonがインストールされていることです。そのため、誰かがローカルのpythonで作業している場合は、プログラムを実行しているPythonインストールがローカルPythonであることを確認してください。これを確認するにはwhich python、を実行し、実行可能ファイルがローカルディレクトリにあるものかどうかを確認します。そうでない場合は、パスを変更しますが、ローカルのPythonディレクトリが他のPythonよりも前であることを確認してください。


私が得た問題は、モジュールがpipによって(再)インストールされ、rootユーザーのみがそれにアクセスできるため、プログラムを実行したユーザーにモジュールが表示されないことでした。
ジャニスElmeris

@JānisElmeris上記のコメントについて詳しく説明していただけますか。私も同様のエラーに直面していると思います。私は私の持っている__init__.pyファイルは、関連するディレクトリに配置されたが、私は手動で使用してパッケージをインストールsetup.py。新しいパッケージをインストールすると、インポートがどのように妨害されますか。
クリシュナオザ

@darth_coder、申し訳ありませんが、それは6年前のことであり、私はケースを覚えていません。また、私は最近Pythonではなく、Pythonをほとんど扱っていません。私が書いたことから、rootとしてパッケージをインストールし、他のユーザーが以前に持っていたアクセス権を持たないように権限を変更したと思うだけです。
ジャニスElmeris

19

簡単な解決策は 、管理者による制限の場合にsudoを使用するpython -m pip install <library-name>代わりに、pip install <library-name>


2
python -m前で何を達成しpip installますか?
sporc

1
@sporc--mコマンドラインフラグを使用すると、Pythonはモジュールまたはパッケージをインポートし、スクリプトとして実行します。-mフラグを使用しない場合、指定したファイルは単なるスクリプトとして実行されます。
トニー・チッカローネ

この回答がwrt python -m pip...working と言っているのかわかりpip...ませんが、実際には同じpythonディレクトリにあると仮定すると、実際には同じものです。おそらく、観察された状況は、スタンドアロンpipプログラムが一部の古いpythonリリースで利用できなかったということでした(しかし、現在は最新の2.7および3.xにあります)。その場合、はpythonローカルvirtualenv pipにあり、そうではなかったためpython -m pip install、ローカルvirtualenv pipにインストールしますが、システムpythonにインストールしようとします(sudoなしで失敗します)。いずれにしても、それは意味がありません。
マイケル2018

17

ディレクトリをパッケージとしてマークするには、というファイルが必要ですが、__init__.pyこれは役に立ちますか?


私はすでにinit .py.binという名前のファイルを持っています。名前をinit .py に変更すると、次のエラーが発生します:/__init__.py "、1行目" utilities "、" demo "] ^ SyntaxError:invalid syntax
エドゥアルド

init .py とは何ですか?質問の一部として投稿してください。
S.Lott、2008

何もありません。空です。ダウンロードしたパッケージに含まれていましたが、ファイルに何かを書き込む必要がありますか?
エドゥアルド

@ S.Lott:init .py に何も入れる必要はありませんよね?
igorgue 2008

1
@Eduardo。あなたのinitの.pyは、エラーを取得します。そして、あなたはそれが空だと言います。それを調整するのは難しい。そして、それをinit .py.bin と呼ぶことはできません-Pythonはこのファイルを無視します。通常、何も含めることができません。
S.Lott、2008

16

使い方PyCharm(JetBrainsのスイートの一部を)あなたがソースとしてスクリプトディレクトリを定義する必要があります。
Right Click > Mark Directory as > Sources Root


12

あなたはこの答えを読んでいて、あなた__init__.pyは正しい場所にいると言っています、あなたはすべての依存関係をインストールしましたが、まだを取得していImportErrorます。

PyCharmを使用して実行するとプログラムが正常に動作するが、ターミナルから実行すると上記のエラーが発生することを除いて、同様の問題に直面していました。さらに調べたところPYTHONPATH、プロジェクトディレクトリのエントリがないことがわかりました。したがって、私PYTHONPATHインポートステートメントごとに設定するとPyCharmで機能しますが、ターミナルからは機能しません

export PYTHONPATH=$PYTHONPATH:`pwd`  (OR your project root directory)

sys.pathas を使用してこれを行う別の方法があります。

import sys
sys.path.insert(0,'<project directory>') OR
sys.path.append('<project directory>')

プロジェクトを検索する順序に基づいて挿入/追加を使用できます。


12

私にとって、それは本当に愚かなことでした。を使用してライブラリをインストールしましたが、ではpip3 installなく自分のプログラムを実行python program.pyしていましたpython3 program.py


1
うわー !それも私にとってはうまくいきました。
JavaDeveloper

1
あなたは私の日を救った。
アイメン

7

うん。__init__.pyパッケージを初期化するファイルであるファイルを含むディレクトリが必要です。ここでは、これを見てください。

__init__.pyファイルは、Pythonがディレクトリをパッケージを含むものとして扱うようにするために必要です。これは、文字列などの一般的な名前のディレクトリが、後でモジュール検索パスで発生する有効なモジュールを誤って非表示にしないようにするために行われます。最も単純なケースでは、__ init__.pyは空のファイルにすることができますが、パッケージの初期化コードを実行したり、後で説明する__all__変数を設定したりすることもできます。


6
  1. インポートするファイルと同じディレクトリにファイル__ init__.pyが必要です。
  2. 同じ名前のファイルをインポートして、PYTHONPATHで構成された2つのフォルダーからのファイルにすることはできません。

例:/ etc / environment

PYTHONPATH = $ PYTHONPATH:/ opt / folder1:/ opt / folder2

/ opt / folder1 / foo

/ opt / folder2 / foo

そして、もしあなたがfooファイルをインポートしようとしているなら、Pythonはあなたがどちらを望むかを知りません。

from foo import ... >>> importerror:fooという名前のモジュールはありません


5

私の2セント:

ここに画像の説明を入力してください

唾:

Traceback (most recent call last):
      File "bash\bash.py", line 454, in main
        import bosh
      File "Wrye Bash Launcher.pyw", line 63, in load_module
        mod = imp.load_source(fullname,filename+ext,fp)
      File "bash\bosh.py", line 69, in <module>
        from game.oblivion.RecordGroups import MobWorlds, MobDials, MobICells, \
    ImportError: No module named RecordGroups

これは私の地獄を混乱させました-投稿と、醜いsyspathハックを示唆する投稿(私の__init__.pyすべてがそこにいたように見える)を通過しました。game / oblivion.pyとgame / oblivionはpythonを混乱させていて、あまり役に立たない「RecordGroupsという名前のモジュールはありません」と吐き出していました。この動作(同じ名前)を文書化した回避策やリンクに興味があります-> EDIT(2017.01.24)- 同じ名前のモジュールとパッケージがある場合どうなりますか?興味深いことに、通常はパッケージが優先されますが、明らかにランチャーがこれに違反しています。

編集(2015.01.17):ここで分析されたカスタムランチャーを使用することについては触れませんでし


パスがオフになっているような。game.oblivion.RecordGroups !== game/oblivion/patchers/RecordGroups.py 使用にあなたのpythonのコードを追加してこれを修正することもできます。game.oblivion.patchers.RecordGroups
ドワイト・スペンサー

@DwightSpencer: "RecordGroups"をインポートしたgame.oblivion.__init__.pyはずですが、これをチェックする必要があるかもしれません
Mr_and_Mrs_D

4

Linux:インポートされたモジュールは/usr/local/lib/python2.7/dist-packagesにあります

Cでコンパイルされたモジュールを使用している場合は、後に.soファイルをchmodすることを忘れないでくださいsudo setup.py install

sudo chmod 755 /usr/local/lib/python2.7/dist-packages/*.so

3

私の場合、問題は、私がdebug python&にリンクしboost::PythonていたことFooLib_d.pydでしたFooLib.pyd。ファイルの名前を変更するか、CMakeLists.txtプロパティを更新すると、エラーが修正されました。


3

上記のすべての方法を試しても失敗した場合、モジュールに組み込みモジュールと同じ名前が付いている可能性があります。または、優先度の高いフォルダに同じ名前のモジュールが存在するsys.pathよりも。

デバッグするには、from foo.bar import baz苦情を言いますImportError: No module named bar。に変更するとimport foo; print foo、のパスが表示されますfoo。それはあなたが期待することですか?

そうでない場合は、名前を変更するfooか、絶対インポートを使用ます。


1
私にとって、これはをもたらしImportError: No module named fooます。
アレックス

3

私の問題は、__init__.pyファイルを含むディレクトリをPYTHONPATHに追加したことです。実際には、その親ディレクトリを追加する必要がありました。


3

まだこの問題を抱えているすべての人に。Pycharmはインポートと混同されると思います。私にとって、「from namespace import something」と書くと、前の行に赤の下線が引かれ、エラーがあることを通知しますが、機能します。ただし、「。namespaceインポートから何か」は下線が引かれず、機能しません。

試す

try:
    from namespace import something 
except NameError:
    from .namespace import something

1
最初のものであるのpython 2構文は、第二は、Python 3である
ターニャBranagan

2

私が書いた問題を修正し、print (sys.path)クリーンインストールにもかかわらず、Pythonが古いパッケージを使用していることがわかりました。これらの作成されたpythonを削除すると、正しいパッケージが自動的に使用されます。


2

私の場合、私はPyCharmを使用しているため、PyCharmはプロジェクトフォルダー内のすべてのプロジェクトに「venv」を作成しますが、それはpythonのミニ環境にすぎません。必要なライブラリをPythonにインストールしましたが、カスタムプロジェクト 'venv'にはありますが、使用できません。これがPyCharmで発生した 'ImportError:xxxxxxという名前のモジュールがありません'の真の理由です。この問題を解決するには、次の手順でライブラリをプロジェクトのカスタム環境に追加する必要があります。

  • PyCharmで、メニューから「ファイル」->設定
  • 設定ダイアログで、プロジェクト:XXXProject-> Project Interpreter
  • 「追加」ボタンをクリックすると、「利用可能なパッケージ」ダイアログが表示されます
  • ライブラリを検索し、「パッケージのインストール」をクリックします
  • 次に、必要なすべてのパッケージがプロジェクトのカスタム「venv」フォルダーにインストールされます。

設定ダイアログ

楽しい。


0

同じ問題が発生した後、私の解決策はpycプロジェクトからすべてのファイルを削除することでしたが、キャッシュされたファイルが何らかの理由でこのエラーを引き起こしているようです。

これを実行するために見つけた最も簡単な方法は、Windowsエクスプローラーでプロジェクトフォルダーに移動してを検索し*.pyc、すべてを選択して(Ctrl+ A)、それらを削除(Ctrl+ X)することでした。

特定のpycファイルを削除するだけで問題を解決できた可能性がありますが、これを試したことはありません


0

私は同じ問題に直面しました:Import error。さらに、ライブラリは100%正しくインストールされています。問題の原因は、私のPCに3バージョンのPython(anacondaパケット)がインストールされていることでした)。これが、ライブラリが適切な場所にインストールされなかった理由です。その後、私のIDE PyCharmで適切なバージョンのpythonに変更しました。


0

同じエラーが発生しました。これは、スクリプトと同じフォルダに誰かがフォルダを作成したために発生しました。その名前は、他の場所からインポートしていたモジュールと競合していました。外部モジュールをインポートする代わりに、予想されるモジュールが明らかに含まれていないこのフォルダー内を調べました。


0

同じ問題(Python 2.7 Linux)がありました。解決策を見つけました。共有したいと思います。私の場合、私は以下の構造を持っていました:

Booklet
-> __init__.py
-> Booklet.py
-> Question.py
default
-> __init_.py
-> main.py

「main.py」で、私は以下のすべての組み合わせに失敗しました:

from Booklet import Question
from Question import Question
from Booklet.Question import Question
from Booklet.Question import *
import Booklet.Question
# and many othet various combinations ...

解決策は思ったよりずっと簡単でした。「Booklet」というフォルダの名前を「booklet」に変更しました。これで、Pythonは 'main.py'でコードを使用することにより、通常はQuestionクラスをインポートできます。

from booklet.Booklet import Booklet
from booklet.Question import Question
from booklet.Question import AnotherClass

このことから、「booklet」のようなパッケージ名(フォルダー)は小文字で始める必要があると結論付けることができます。そうでない場合、Pythonはそれをクラス名やファイル名と混同します。

どうやら、これはあなたの問題ではなかったようですが、John Fouhyの答えは非常によく、このスレッドにはこの問題を引き起こす可能性のあるほとんどすべてのものが含まれています。だから、これはもう一つのことであり、多分これが他の人を助けることができることを願っています。


0

私の場合、実際のパッケージの下ではなく、package.eggフォルダーへのパスを含めていました。パッケージをトップレベルにコピーしましたが、うまくいきました。


0

これは私にとってうまくいきました:__init__.py親フォルダー内にファイルを作成しました(あなたの場合、site-packagesフォルダー内)。そして、このようにインポートされます:

from site-packages.toolkit.interface import interface

それがあなたにも役立つことを願っています!


0

Linuxサーバーで試してください dos2unix script_name

pycコマンドを使用してすべての(存在する場合)ファイルを削除しますfind . -name '*.pyc' -delete

Windowsでスクリプトを操作した場合は、ケースで再実行します


0

私の場合、sys.path.insert()ローカルモジュールのインポートに使用していmodule not foundて、別のライブラリから取得していました。私はsys.path.insert()報告された輸入品の下に置かなければなりませんでしたmodule not found。ベストプラクティスはsys.path.insert()、インポートの下部に配置することです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.