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がファイルを見つけられないのか私にはわかりません。何か案は?権限の問題になりますか?実行権限が必要ですか
Oripの投稿に対するあなたのコメントに基づいて、私はこれが起こったと思います:
__init__.py
をWindows上で編集しました。__init__.py
(現在は__init__.py.bin
と呼ばれる)は、pythonがツールキットをパッケージとして認識していないことを意味します。__init__.py
を作成すれば、すべてうまくいきます。する
(local directory)/site-packages/toolkit
__init__.py
がありますか?
インポートを walk にするためには、すべてのディレクトリに__init__.py
ファイルが必要です。
* nixでは、PYTHONPATHが正しく設定されていることも確認してください。特に次の形式であることを確認してください。
.:/usr/local/lib/python
(.:
を最初に注意して、現在のディレクトリでも検索できるようにします。)
バージョンによっては、他の場所にある場合もあります。
.:/usr/lib/python
.:/usr/lib/python2.6
.:/usr/lib/python2.7 and etc.
LPTHWでこの演習を行ったとき、私は非常によく似たことに遭遇しました。呼び出し元のディレクトリにファイルがあることをPythonに認識させることはできませんでした。しかし、私はそれを最終的に機能させることができました。私がしたこと、そして私がお勧めすることはこれを試すことです。
(注:最初の投稿から、* NIXベースのマシンを使用していてコマンドラインから実行していると想定しているので、このアドバイスはそれに合わせています。Ubuntuを実行しているので、これは私がしたことです)
1)ディレクトリ(cd)を、ファイルがあるディレクトリ above に変更します。この場合、あなたはmountain.py
ファイルを実行しようとしていて、toolkit.interface.py
モジュールを呼び出そうとしています。それらは別々のディレクトリにあります。この場合は、両方のファイルへのパスを含むディレクトリ(つまり、両方のファイルのパスが共有する最も近いディレクトリ)に移動します。この場合それはtoolkit
ディレクトリです。
2)tookit
ディレクトリにいるときは、コマンドラインに次のコード行を入力します。
export PYTHONPATH=.
これはあなたのPYTHONPATHを "。"に設定します。これは基本的にあなたのPYTHONPATHがあなたが現在いるディレクトリ内の呼び出されたファイルを探すことを意味します(そしてもっと重要なのは サブディレクトリブランチ 現在のディレクトリだけでなく、 in あなたの現在のディレクトリにあるすべてのディレクトリを調べます。
3)上記の手順でPYTHONPATHを設定したら、現在のディレクトリ(toolkit
ディレクトリ)からモジュールを実行します。 Pythonは指定されたモジュールを見つけてロードするはずです。
お役に立てれば。私はこれにとても不満を感じました。
私は自分自身の問題を解決しました、そして私は間違っていたこととその解決策の要約を書きます:
ファイルは正確に__init__.py
と呼ばれる必要があります。私の場合の.py.bin
のように拡張子が異なると、Pythonはディレクトリを移動できず、モジュールを見つけることができません。ファイルを編集するには、 vi または nano などのLinuxエディタを使用する必要があります。あなたがWindowsエディタを使用するならば、これはいくつかの隠された文字を書くでしょう。
それに影響を及ぼしていたもう一つの問題は私がルートによってインストールされた別のPythonバージョンを持っているということでした。これを確認するには、which python
を実行し、実行可能ファイルがローカルディレクトリにあるものかどうかを確認します。そうでない場合は、パスを変更しますが、ローカルのPythonディレクトリが他のPythonよりも前にあることを確認してください。
簡単な解決策は、python -m pip install <library-name>
の代わりにpip install <library-name>
を使用してモジュールをインストールすることです。管理者制限がある場合はSudoを使用できます。
ディレクトリをパッケージとしてマークするには、__init__.py
という名前のファイルが必要ですが、これは役に立ちますか?
PyCharm
(JetBrainsスイートの一部)を使って、スクリプトディレクトリをSourceとして定義する必要があります。Right Click > Mark Directory as > Sources Root
例:/ etc/environment
PYTHONPATH = $ PYTHONPATH:/ opt/folder1:/ opt/folder2
/ opt/folder1/foo
/ opt/folder2/foo
そして、あなたがfooファイルをインポートしようとしているなら、pythonはあなたが欲しいものを知りません。
fooのインポートから... >>> importerror:fooという名前のモジュールはありません
うん。 __init__.py
ファイルを含むディレクトリが必要です。これはパッケージを初期化するファイルです。ここで、 this を見てください。
__init__.pyファイルは、Pythonがディレクトリをパッケージを含むものとして扱うようにするために必要です。これは、文字列などの共通名を持つディレクトリが、モジュール検索パスで後で発生する有効なモジュールを意図せずに隠してしまうのを防ぐために行われます。最も単純な場合、__ init__.pyは単なる空のファイルになることができますが、パッケージの初期化コードを実行したり、後述する__all__変数を設定したりすることもできます。
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
私の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は混乱を招くような「RecordGroupsという名前のモジュールはありません」というpythonを混乱させていたことがわかります。回避策や、この(同じ名前の)動作を文書化したリンク(あるいはその両方) - > EDIT(2017.01.24) - に注目してください 同じ名前のモジュールとパッケージがある場合はどうすればよいですか。 おもしろいことに通常 packages が優先されますが、どうやら私たちのランチャーはこれに違反しています。
私の場合、問題は私が debug python
&boost::Python
にリンクしていたことです。これは拡張子がFooLib_d.pyd
ではなくFooLib.pyd
であることを要求します。ファイル名を変更するかCMakeLists.txt
プロパティを更新することでエラーを修正しました。
私の問題は、実際にその親ディレクトリを追加する必要があるときに、__init__.py
ファイルを含むディレクトリをPYTHONPATHに追加したことです。
あなたはこの答えを読んでいます、あなたの__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>')
プロジェクトを検索したい順序に基づいて挿入/追加を使用できます。
上記のすべての方法を試しても失敗した場合は、モジュールに 同じ名前 が組み込みモジュールとして含まれている可能性があります。または、 同じ名前 を持つモジュールが、自分のモジュールよりもsys.path
の優先順位が高いフォルダに存在します。
デバッグするには、from foo.bar import baz
の苦情をImportError: No module named bar
と言います。 import foo; print foo
に変更すると、foo
のパスが表示されます。それはあなたが期待していることですか?
そうでない場合は、foo
の名前を変更するか、 絶対インポート を使用してください。
print (sys.path)
を書くことによって私の問題を修正し、pythonがクリーンインストールにもかかわらず古いパッケージを使用していたことを発見しました。これらのpythonを削除すると自動的に正しいパッケージが使用されます。
私の場合は、私はPyCharmを使用していて、PyCharmはプロジェクトフォルダ内のすべてのプロジェクトに対して 'venv'を作成しますが、これはpythonのミニ環境にすぎません。 Pythonで必要なライブラリをインストールしましたが、カスタムプロジェクト 'venv'では使用できません。これが 'ImportError:xxxxxxという名前のモジュール'がPyCharmで発生した本当の理由です。この問題を解決するには、次の手順でプロジェクトのカスタム環境にライブラリを追加する必要があります。
楽しい。
私は同じエラーがありました。誰かが私のスクリプトと同じフォルダにフォルダを作成したことが原因でした。その名前は、他の場所からインポートしていたモジュールと競合していました。外部モジュールをインポートする代わりに、このフォルダ内を見て、明らかに期待されるモジュールが含まれていませんでした。
これは私のために働きました:親フォルダーの中に__init__.py
ファイルを作成しました(あなたの場合、site-packages
フォルダーの中に)。そしてこのようにインポートされました:
from site-packages.toolkit.interface import interface
それがあなたにとっても役立つことを願っています!
私は同じ問題を抱えていました(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の 答えは非常によく、このスレッドはこの問題を引き起こすことができるものをほとんどすべて持っています。だから、これはもう一つのことだと私は多分これは他の人を助けることができると思います。
プロジェクトからすべてのpyc
ファイルを削除することで解決したのと同じ問題に遭遇した後、これらのキャッシュファイルが何らかの理由でこのエラーを引き起こしたようです。
一番簡単な方法は、Windowsエクスプローラで自分のプロジェクトフォルダに移動して*.pyc
を検索し、次にallを選択することでした。Ctrl+A)とそれらを削除(Ctrl+X).
その可能性私はちょうど特定のpyc
ファイルを削除することによって私の問題を解決できたが私はこれを試したことがない
私は同じ問題に直面しました:Import error
。さらに、ライブラリは100%正しくインストールされました。問題の原因は私のPC 3にpython(anacondaパケット)がインストールされていることです。これが、ライブラリが正しい場所にインストールされていない理由です。その後、私は自分のIDE PyCharmで適切なバージョンのpythonに変更しました。
私の場合は、その下の実際のパッケージではなく、package.Eggフォルダーへのパスを含めていました。私はパッケージをトップレベルにコピーしました、そしてそれはうまくいきました。
私にとって、それは本当に馬鹿げたものでした。 pip3 install
を使用してライブラリをインストールしましたが、python program.py
ではなくpython3 program.py
としてプログラムを実行していました。ときどき¯\_(ツ)_/¯
のようになります。
まだこの問題を持っているすべての人へ。私はPycharmは輸入品と混同されますと信じています。 i「は名前空間のインポート何かから」書くとき私にとっては、前の行はエラーがあることを知らせる、赤い下線が、機能します。しかし「」.namespaceインポート何かから」下線付き得ることはありませんが、また、動作しません。
試します
try:
from namespace import something
except NameError:
from .namespace import something