Pythonエラー「ImporterRor:名前付きモジュールなし」
-
19-08-2019 - |
質問
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に示す。私も持っています __init__.py.bin
例ディレクトリで。
Pythonが入っているときにファイルが見つからない理由がわかりません sys.path
. 。何か案は?それは権限の問題になる可能性がありますか?実行許可が必要ですか?
解決
ORIPの投稿へのコメントに基づいて、これが起こったことだと思います。
- 編集しました
__init__.py
Windowsで。 - Windowsエディターは、非印刷を追加しました。おそらくキャリッジリターン(Windowsの終了はCR/LF、UNIXではLFのみです)、またはおそらくCTRL-Z(Windows End-offile)です。
- WinSCPを使用して、ファイルをUNIXボックスにコピーしました。
- WinSCPは、「これには基本的なテキストではないものがあります。バイナリデータを示すために.bin拡張子を配置します。」
- 行方不明
__init__.py
(今と呼ばれています__init__.py.bin
)PythonがToolkitをパッケージとして理解していないことを意味します。 - 作成します
__init__.py
適切なディレクトリで、すべてが機能します...?
他のヒント
します
(local directory)/site-packages/toolkit
持っている __init__.py
?
インポートを作成します 歩く ディレクトリを通じて、すべてのディレクトリにはを必要です __init__.py
ファイル。
*nixでは、PythonPathが正しく構成されていることを確認してください。特にこの形式があることを確認してください。
.:/usr/local/lib/python
(気をつけて .:
最初は、現在のディレクトリでも検索できます。)
また、バージョンに応じて、他の場所にある場合があります。
.:/usr/lib/python
.:/usr/lib/python2.6
.:/usr/lib/python2.7 and etc.
LPTHWでこの演習をしたとき、私は非常によく似たものに出くわしました。 Pythonに、電話をかけていたディレクトリにファイルがあることを認識することはできませんでした。しかし、私はそれを最終的に動作させることができました。私がしたこと、そして私が推奨することは、これを試すことです:
(注:あなたの最初の投稿から、私はあなたが *nixベースのマシンを使用しており、コマンドラインから物事を実行していると仮定しているので、このアドバイスはそれに合わせて調整されています。
1)ディレクトリ(CD)をディレクトリに変更する その上 ファイルがあるディレクトリ。この場合、実行しようとしています mountain.py
ファイル、および電話をかけようとしています toolkit.interface.py
モジュール。独立したディレクトリにあります。この場合、両方のファイルへのパスを含むディレクトリに移動します(つまり、両方のファイルのパスが共有する最も近いディレクトリ)。この場合、これは次のとおりです toolkit
ディレクトリ。
2)あなたがいるとき tookit
ディレクトリ、コマンドラインにこのコード行を入力してください。
export PYTHONPATH=.
これにより、PythonPathが「」に設定されます。これは、基本的に、PythonPathが現在のディレクトリ内の呼び出したファイルを探していることを意味します(そして、その点まで、 サブディレクトリブランチ あなたがいるディレクトリの。だから、それはあなたの現在のディレクトリだけでなく、すべてのディレクトリで見るだけでなく の 現在のディレクトリ)。
3)PythonPathを上のステップに設定した後、現在のディレクトリからモジュールを実行します( toolkit
ディレクトリ)。 Pythonは、指定したモジュールを見つけてロードする必要があります。
お役に立てれば。私はこれにかなりイライラしていました。
私は自分の問題を解決しました、そして、私は間違ったものと解決策の要約を書きます:
ファイルを正確に呼び出す必要があります __init__.py
. 。私の場合のように拡張機能が異なる場合 .py.bin
その後、Pythonはディレクトリを移動できず、モジュールを見つけることができません。ファイルを編集するには、Linuxエディタを使用する必要があります。 vi また ナノ. 。 Windowsエディターを使用する場合、これはいくつかの隠された文字を書きます。
それに影響を与えていたもう1つの問題は、ルートによって別のPythonバージョンをインストールしたことでした。そのため、誰かがPythonのローカルインストールを使用している場合は、プログラムを実行しているPythonインストールがローカルPythonであることを確認してください。これを確認するには、ただ実行してください which python
, 、そして、実行可能があなたのローカルディレクトリにあるものであるかどうかを確認します。そうでない場合は、パスを変更しますが、ローカルPythonディレクトリが他のPythonよりも前であることを確認してください。
ディレクトリをパッケージとしてマークするには、名前付きファイルが必要です __init__.py
, 、これは助けになりますか?
簡単な解決策は、モジュールを使用してインストールすることです python -m pip install <library-name>
それ以外の pip install <library-name>
管理者が制限されている場合にsudoを使用できます
使用 PyCharm
(JetBrains Suiteの一部)スクリプトディレクトリをソースとして定義する必要があります。
Right Click > Mark Directory as > Sources Root
うん。を含むためにディレクトリが必要です __init__.py
ファイル。これは、パッケージを初期化するファイルです。ここで、見てください これ.
__init__.pyファイルは、Pythonをディレクトリを含むパッケージとして扱うために必要です。これは、文字列などの共通名で、モジュール検索パスで後で発生する有効なモジュールを意図せずに隠すことを防ぐために行われます。最も簡単な場合、__init__.pyは空のファイルにすぎない可能性がありますが、パッケージの初期化コードを実行したり、後で説明したりする__all__変数を設定することもできます。
- インポートしているファイルである同じディレクトリにファイル__ init__.pyが必要です。
- 同じ名前のファイルをインポートして、PythonPathで構成された2つのフォルダーのファイルになることはできません。
例: /etc /環境
pythonpath = $ pythonpath:/opt/folder1:/opt/folder2
/opt/folder1/foo
/opt/folder2/foo
また、Fooファイルをインポートしようとしている場合、Pythonはどちらが必要かを知りません。
foo importから... >>> ImporterRor:fooという名前のモジュールなし
私の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
すべてそこにいた)。ゲーム/oblivion.pyとゲーム/オブリビオンは、かなり役に立たない「レコードグループという名前のモジュールなし」を吐き出すPythonを混乱させていたことがわかりました。私はこの(同じ名前)動作を文書化する回避策やリンクに興味があります - >編集(2017.01.24) - 同じ名前のモジュールとパッケージがある場合はどうなりますか? 興味深いことに、通常 パッケージ 優先されますが、明らかにランチャーはこれに違反しています。
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
あなたはこの答えを読んでいます __init__.py
適切な場所にあり、あなたはすべての依存関係をインストールしました、そしてあなたはまだ取得しています ImportError
.
Pycharmを使用して実行したときにプログラムが正常に実行されることを除いて、私は同様の問題に直面していましたが、上記のエラーは端末から実行します。さらに掘り下げた後、私はそれを見つけました PYTHONPATH
プロジェクトディレクトリのエントリはありませんでした。だから、私は設定します PYTHONPATH
あたり インポートステートメントはPycharmで機能しますが、ターミナルからではありません:
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>')
プロジェクトを検索したい順序に基づいて、挿入/追加を使用できます。
私の場合、問題は私がリンクしていたことでした デバッグ python
& boost::Python
, 、拡張機能が必要です FooLib_d.pyd
, 、 だけでなく FooLib.pyd
;ファイルの名前を変更するか、更新します CMakeLists.txt
プロパティはエラーを修正しました。
私の問題は、私がディレクトリを追加したことでした __init__.py
実際にその親ディレクトリを追加する必要がある場合、PythonPathにファイルします。
上記で提供されているすべての方法を試したが失敗した場合、おそらくあなたのモジュールは持っています 同じ名前 組み込みモジュールとして。または、のモジュール 同じ名前 優先度が高いフォルダーに存在する sys.path
モジュールよりも。
デバッグするには、あなたを言います from foo.bar import baz
苦情 ImportError: No module named bar
. 。に変わる import foo; print foo
, 、の道を示します foo
. 。それはあなたが期待するものですか?
そうでない場合は、どちらも名前を変更します foo
または使用します 絶対輸入.
私の場合、私はPycharmとPycharmを使用しているため、プロジェクトフォルダーのすべてのプロジェクトに対して「Venv」を作成しますが、Pythonのミニ環境にすぎません。 Pythonに必要なライブラリをインストールしましたが、カスタムプロジェクト「Venv」では、利用できません。これが「ImporterRor:xxxxxxという名前のモジュール」がPycharmで発生した本当の理由です。この問題を解決するには、これらの手順でプロジェクトCustom Envにライブラリを追加する必要があります。
- Pycharmで、メニュー「ファイル」 - >設定から
- 設定]ダイアログ、プロジェクト:xxxproject-> [プロジェクトインタープリター
- 追加]ボタンをクリックすると、「利用可能なパッケージ」ダイアログが表示されます
- ライブラリを検索し、[パッケージのインストール]をクリックします
- その後、必要なすべてのパッケージは、Project Custom 'venv'フォルダーにインストールされます。
楽しみ。
書くことによって私の問題を修正しました print (sys.path)
そして、Pythonがクリーンなインストールにもかかわらず、時代遅れのパッケージを使用していることがわかりました。これらの作成されたPythonを削除して、正しいパッケージを自動的に使用します。
まだこの問題を抱えているすべての人に。 Pycharmは輸入と混同されると思います。私にとって、「名前空間から何かをインポートする」と書くと、前の行は赤で下線が付けられ、エラーがあるが機能することを示しています。ただし、 '' .namespace Import Somethingから
試す
try:
from namespace import something
except NameError:
from .namespace import something
同じ問題に苦しんだ後、私の決意はすべてを削除することであることがわかりました pyc
私のプロジェクトのファイルは、これらのキャッシュされたファイルが何らかの形でこのエラーを引き起こしているようです。
私がこれを行うために私が見つけた最も簡単な方法は、Windowsエクスプローラーのプロジェクトフォルダーに移動して検索することでした *.pyc
, 、次にすべてを選択します(Ctrl+a)そしてそれらを削除する(Ctrl+バツ).
特定のものを削除するだけで問題を解決できた可能性があります pyc
ファイルですが、私はこれを試したことはありません
私は同じ問題に直面しました: Import error
. 。さらに、ライブラリは100%正しくインストールされています。問題の原因は、PC 3バージョンのPython(Anaconda Packet)がインストールされていることでした。これが、ライブラリが適切な場所にNOに設置された理由です。その後、My IDE PycharmのPythonの適切なバージョンに変更しました。
同じエラーがありました。これは、私のスクリプトと同じフォルダーにフォルダーを作成する人が原因であり、その名前は私が他の場所からインポートしていたモジュールと競合しました。外部モジュールをインポートする代わりに、予想されるモジュールが含まれていなかったこのフォルダーの内部を調べました。
同じ問題(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 ...
ソリューションは思ったよりもはるかにシンプルでした。フォルダー「ブックレット」を「ブックレット」に変更しましたが、それだけです。 Pythonは、「main.py」でコードを使用して、通常、クラスの質問をインポートできます。
from booklet.Booklet import Booklet
from booklet.Question import Question
from booklet.Question import AnotherClass
これから、「ブックレット」のようなパッケージ名(フォルダー)は低ケースから開始する必要があり、その場合、Pythonはクラス名とファイル名と混同しなければならないと結論付けることができます。
どうやら、これはあなたの問題ではありませんでしたが、 ジョン・フーヒーズ 答えは非常に優れており、このスレッドにはこの問題を引き起こす可能性のあるものはほとんど何でもあります。だから、これはもう1つのことであり、多分これが他の人を助けることができることを願っています。
私の場合、私は実際のパッケージではなく、パッケージフォルダーへのパスを含めていました。パッケージをトップレベルにコピーしましたが、機能しました。
これは私のために機能しました:作成しました __init__.py
親フォルダー内のファイル(あなたの場合、内部 site-packages
フォルダ)。そして、このようにインポートしました:
from site-packages.toolkit.interface import interface
それがあなたにも役立つことを願っています!