web-dev-qa-db-ja.com

Pythonエラー "ImportError:No module named"

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に示しています。 examplesディレクトリにも__init__.py.binがあります。

sys.pathに入っているのになぜPythonがファイルを見つけられないのか私にはわかりません。何か案は?権限の問題になりますか?実行権限が必要ですか

368
Eduardo

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

  1. あなたは__init__.pyをWindows上で編集しました。
  2. ウィンドウズエディタは何も印刷しないもの、おそらくキャリッジリターン(ウィンドウズの行末はCR/LFです; unixではそれはLFのみです)あるいはおそらくCTRL-Z(ウィンドウズの終わり-of-file)。
  3. あなたはWinSCPを使ってあなたのUNIXボックスにファイルをコピーした。
  4. WinSCPは、「これは基本的なテキストではないものがあります。バイナリデータを示すために、.bin拡張子を付けます。」
  5. 不足している__init__.py(現在は__init__.py.binと呼ばれる)は、pythonがツールキットをパッケージとして認識していないことを意味します。
  6. 適切なディレクトリに__init__.pyを作成すれば、すべてうまくいきます。
233
John Fouhy

する

(local directory)/site-packages/toolkit

__init__.pyがありますか?

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

59
igorgue

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

 .:/usr/local/lib/python

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

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

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

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

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

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

2)tookitディレクトリにいるときは、コマンドラインに次のコード行を入力します。

export PYTHONPATH=.

これはあなたのPYTHONPATHを "。"に設定します。これは基本的にあなたのPYTHONPATHがあなたが現在いるディレクトリ内の呼び出されたファイルを探すことを意味します(そしてもっと重要なのは サブディレクトリブランチ 現在のディレクトリだけでなく、 in あなたの現在のディレクトリにあるすべてのディレクトリを調べます。

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

お役に立てれば。私はこれにとても不満を感じました。

33
Specterace

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

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

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

22
Eduardo

簡単な解決策は、python -m pip install <library-name>の代わりにpip install <library-name>を使用してモジュールをインストールすることです。管理者制限がある場合はSudoを使用できます。

16
Badr Bellaj

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

16
orip

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

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

例:/ etc/environment

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

/ opt/folder1/foo

/ opt/folder2/foo

そして、あなたがfooファイルをインポートしようとしているなら、pythonはあなたが欲しいものを知りません。

fooのインポートから... >>> importerror:fooという名前のモジュールはありません

6
Iasmini Gomes

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

__init__.pyファイルは、Pythonがディレクトリをパッケージを含むものとして扱うようにするために必要です。これは、文字列などの共通名を持つディレクトリが、モジュール検索パスで後で発生する有効なモジュールを意図せずに隠してしまうのを防ぐために行われます。最も単純な場合、__ init__.pyは単なる空のファイルになることができますが、パッケージの初期化コードを実行したり、後述する__all__変数を設定したりすることもできます。

6
miya

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

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

Sudo chmod 755 /usr/local/lib/python2.7/dist-packages/*.so
4
KrisWebDev

私の2セント:

enter image description here

スピット:

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は混乱を招くような「RecordGroupsという名前のモジュールはありません」というpythonを混乱させていたことがわかります。回避策や、この(同じ名前の)動作を文書化したリンク(あるいはその両方) - > EDIT(2017.01.24) - に注目してください 同じ名前のモジュールとパッケージがある場合はどうすればよいですか。 おもしろいことに通常 packages が優先されますが、どうやら私たちのランチャーはこれに違反しています。

編集(2015年1月17日):私たちは カスタムランチャー 解剖 ここ を使用することは言及しなかった。

3
Mr_and_Mrs_D

私の場合、問題は私が debug pythonboost::Pythonにリンクしていたことです。これは拡張子がFooLib_d.pydではなくFooLib.pydであることを要求します。ファイル名を変更するかCMakeLists.txtプロパティを更新することでエラーを修正しました。

3
peter karasev

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

3
Rich

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

PyCharmを使用して実行したときにプログラムが正常に実行されるが、端末から実行したときに上記のエラーが発生することを除いて、私は同様の問題に直面していました。さらに掘り下げてみると、PYTHONPATHにプロジェクトディレクトリのエントリがないことがわかりました。そのため、PYTHONPATH per ImportステートメントはPyCharmでは機能しますが、terminal からは機能しません。

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

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

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

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

3
avp

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

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

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

2
liushuaikobe

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

1
dukevin

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

  • PyCharmでは、メニューの 'ファイル' - >設定から
  • 設定ダイアログで、プロジェクト:XXXプロジェクト - >プロジェクトインタプリタを選択します。
  • [追加]ボタンをクリックすると、[利用可能なパッケージ]ダイアログが表示されます。
  • あなたのライブラリを検索し、 'Install Package'をクリックしてください。
  • その後、必要なすべてのパッケージがプロジェクトカスタムの「venv」フォルダにインストールされます。

Settings dialog

楽しい。

1
Yuanhui

私は同じエラーがありました。誰かが私のスクリプトと同じフォルダにフォルダを作成したことが原因でした。その名前は、他の場所からインポートしていたモジュールと競合していました。外部モジュールをインポートする代わりに、このフォルダ内を見て、明らかに期待されるモジュールが含まれていませんでした。

0
Toivo Säwén

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

from site-packages.toolkit.interface import interface

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

0
Sherzod

私は同じ問題を抱えていました(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'のようなPackage-Names(フォルダー)は小文字で始める必要があると結論付けることができます。そうしないと、Pythonはクラス名とファイル名と混同します。

どうやら、これはあなたの問題ではありませんでした、しかし ジョンFouhyの 答えは非常によく、このスレッドはこの問題を引き起こすことができるものをほとんどすべて持っています。だから、これはもう一つのことだと私は多分これは他の人を助けることができると思います。

0
ioaniatr

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

一番簡単な方法は、Windowsエクスプローラで自分のプロジェクトフォルダに移動して*.pycを検索し、次にallを選択することでした。Ctrl+A)とそれらを削除(Ctrl+X).

その可能性私はちょうど特定のpycファイルを削除することによって私の問題を解決できたが私はこれを試したことがない

0
Sayse

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

0
Rocketq

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

0
Fakrudeen

私にとって、それは本当に馬鹿げたものでした。 pip3 installを使用してライブラリをインストールしましたが、python program.pyではなくpython3 program.pyとしてプログラムを実行していました。ときどき¯\_(ツ)_/¯のようになります。

0
kev

まだこの問題を持っているすべての人へ。私はPycharmは輸入品と混同されますと信じています。 i「は名前空間のインポート何かから​​」書くとき私にとっては、前の行はエラーがあることを知らせる、赤い下線が、機能します。しかし「」.namespaceインポート何かから​​」下線付き得ることはありませんが、また、動作しません。

試します

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