Pythonスクリプトを実行しようとすると、「ImportError:No module named」


144

特にpythonスクリプトを起動するスクリプトを実行しようとしています。ImportError:No moduleという名前のモジュールが表示されますが、ipythonを起動し、インタープリターを介して同じ方法で同じモジュールをインポートすると、モジュールは受け入れられます。

何が起こっているのですか、どうすれば修正できますか?PythonがPYTHONPATHを使用する方法を理解しようとしましたが、完全に混乱しています。どんな助けでも大歓迎です。


4
あなたはより多くの情報を与える必要があります。「スクリプトを実行する」とは、シェルスクリプトを意味しますか?インポートできないのはどのモジュールですか?そのモジュールはどこにありますか?スクリプトはどこにありますか?
BrenBarn 2013年

2
「何が起こっているのか」に対する明確な回答が必要な場合は、-vオプションを指定してpythonを起動すると、インポートしたモジュールをpythonが見つけている場所(または見つけていない場所)がわかります。
FatalError 2013年

何をインポートしようとしていますか?2つのpythonスクリプトは同じディレクトリにありますか?
pynovice 2013年

2
実行しているコード、スタックトレースの全文、およびエラーを生成するために実行している正確な手順をお知らせください。正確な問題が何であるかわからない場合、支援するのはかなり困難です。
MattDMo 2013年

5
質問が最初に尋ねられてから4年後でも、多くのユーザーが経験する問題だと思います。
CodeOcelot 2017年

回答:


182

この問題は、コマンドラインIPythonインタープリターが現在のパスを使用する方法と、個別のプロセス(IPythonノートブック、外部プロセスなど)が使用する方法が原因で発生します。IPythonは、sys.pathだけでなく、現在の作業ディレクトリにもあるインポートするモジュールを探します。コマンドラインからインタープリターを起動すると、現在操作しているディレクトリは、ipythonを起動したディレクトリと同じです。

import os
os.getcwd() 

これが本当であることがわかります。

ただし、ipythonノートブックを実行os.getcwd()していて、現在の作業ディレクトリが、代わりにipython_notebook_config.pyファイルでノートブックを操作するように指示したフォルダーであるとします(通常はc.NotebookManager.notebook_dir設定を使用します)。

解決策は、Pythonインタープリターにモジュールへのパスを提供することです。最も簡単な解決策は、sys.pathリストにそのパスを追加することです。ノートブックで、まず次のことを試してください。

import sys
sys.path.append('my/path/to/module/folder')

import module-of-interest

それがうまくいかない場合は、インポートへのパスとは関係のない別の問題が発生しているため、問題に関する詳細情報を提供する必要があります。

これを解決するためのより良い(そしてより永続的な)方法は、PYTHONPATHを設定することです。これにより、Pythonパッケージ/モジュールを探す追加のディレクトリがインタープリターに提供されます。PYTHONPATHをグローバル変数として編集または設定することはosに依存しており、ここではUnixまたはWindowsについて詳しく説明します


1
PSA:あなたはjupyter-ノートブックでこのエラーを取得しているので、あなたがこのSOの質問に来ている場合は、その後、下記を参照してくださいstackoverflow.com/a/27944947/127971 残念ながら、質問には、単一の答えのための具体的な十分ではありません。
マイケル

その答えは、一般的なケースでPythonモジュールをインポートすることです。dunder init.pyファイルは、インタープリターがインポートするモジュール(ノートブックかどうか)のディレクトリーを検索するときに必要です。ノートブックインタープリターの作業ディレクトリとPYTHONPATHの設定に関する上記の答えは正しいです。
BoltzmannBrain

質問の文言が原因で、複数の正解が出てくるだろうと私は言った。私はこの答え正しくないことを意味していません。しかし、jupyter-notebookを使用している場合は、ファイルに触れるだけですよね__init_.py?...そして、それらも正しい(正しい?)場合でも、を変更したり呼び出したりしたくありません。つまり、コード内に数十のディレクトリがあり、それらをすべてパスに追加するつもりはありません。または、たとえそれが1つのディレクトリであっても、他のユーザーにjupyter設定ファイルを期待します。PYTHONPATHsys.path.append
マイケル

16

__init__.pyPythonプロジェクトの実行中に、エラーが表示されたフォルダーの下に空のPythonファイルを作成します。


1
'でinit.py 'あなたは'_意味init_の.py'、右か?私は_ init_ .pyを空のファイルとして作成しましたが、それでうまくいきました。どうもありがとう。しかし、なぜこれが必要なのでしょうか?以前、私のipythonノートブックと同じディレクトリにpythonスクリプトがあり、インポートは正常に機能していました。
Eduardo Reis

3
実際にinit .pyは、対応する場所に含まれているパッケージがあることを示すためにpythonを示すために使用されます。次に、その下で作成したサブモジュールを見つけます。' init .py'を作成しないと、Pythonはその中にパッケージがあることを認識しません。例:この例の「Myfolder.Mypackage import Mymodules」から、たとえば、ここにパッケージがあることをpythonに指示するようにinit .pyを開始する必要があります。そうでなければそれは知りません。
Mohideen bin Mohammed 2015

1
うん、完璧な答え。これはpython 2.7で必要ですが、3
Agape Gal'lo

これでpython 3の問題が修正されました。
リックはモニカを

私の問題も修正しました-jupyterノートブックを使用し、pythonソースをipynbファイルのサブディレクトリに置きます。たとえば、ノートブックが使用できるように、foo.ipynbを使用してbar/baz.py空のbar/__init__.pyファイルを追加しますfrom bar.baz import MyClass
マイケル

12

両方が同じインタープリターを使用していることを確認してください。これはUbuntuで私に起こりました:

$ ipython3 -c 'import sys; print(sys.version)'
3.4.2 (default, Jun 19 2015, 11:34:49) \n[GCC 4.9.1]

$ python3 -c 'import sys; print(sys.version)'
3.3.0 (default, Nov 27 2012, 12:11:06) \n[GCC 4.6.3]

そしてsys.path、2人の通訳の間に違いがありました。それを修正するために、Python 3.3を削除しました。


minicondaを使用してpython関連のものをインストールしたので、この問題も発生しました。バンドルされているubuntu python 2.7は、miniconda python 2.7とは異なります。この回答により、問題を修正することができました
bph

4
これが私の問題でした。私はpython 2.7.11にアップグレードしましたが、iPythonインタラクティブシェルはまだ2.7.5を使用しています。pip install --upgrade ipython最新バージョンを取得するために実行する必要があるだけで、デフォルトでは自動的に2.7.11が使用されました。
Abundnce10

私のIPythonは7.4.0ですが、そのようなPythonバージョンはまったくありません。
aderchox

:インタプリタのバージョンを取得するためにipythonでこれを実行します@aderchoximport sys; sys.version
z0r

7

主な理由は、PythonとIPythonのsys.pathsが異なるためです。

lucyparkリンクを参照してください。解決策は私の場合に機能します。opencvをインストールすると発生します

conda install opencv

そしてiPythonでインポートエラーが発生しました、この問題を解決するには3つのステップがあります:

import cv2
ImportError: ...

1.次のコマンドでPythonおよびiPythonのパスを確認します

import sys
sys.path

PythonとJupyterの結果は異なります。2番目のステップは、sys.path.append 試行錯誤によって失われたパスを修正するために使用するだけです。

2.一時的な解決策

iPythonの場合:

import sys
sys.path.append('/home/osboxes/miniconda2/lib/python2.7/site-packages')
import cv2

ImportError:..解決した問題

3.永続的なソリューション

iPythonプロファイルを作成し、初期追加を設定します。

bashシェルの場合:

ipython profile create
... CHECK the path prompted , and edit the prompted config file like my case
vi /home/osboxes/.ipython/profile_default/ipython_kernel_config.py

viで、ファイルに追加します。

c.InteractiveShellApp.exec_lines = [
 'import sys; sys.path.append("/home/osboxes/miniconda2/lib/python2.7/site-packages")'
]

完了


'ipython profile create' ....はい!これは、すべてのファイル(yuk)の先頭にある厄介なsys.pathステートメントに頼らずに、環境PATHおよびPYTHONPATH ...から読み取らないjupyterノートブックに対処する唯一の(永続的な)ソリューションです。@jesseありがとうございます。
JohnL_10

6

やってsys.path.append('my-path-to-module-folder')動作しますが、IPythonでは、モジュールを使用するたびにこれを実行することを避けるために、あなたは追加することができexport PYTHONPATH="my-path-to-module-folder:$PYTHONPATH"、あなたに~/.bash_profileファイル。


2

ipythonをインストールする前に、easy_installを使用してモジュールをインストールしました。と言うsudo easy_install mechanize

ipythonをインストールした後、ipythonがモジュールを認識するようにeasy_installを再実行する必要がありました。


2

同様の問題があり、python3ではなくを呼び出して修正pythonしました。私のモジュールはPython3.5でした。


2

コマンドラインから実行している場合、Pythonインタープリターがモジュールを探す場所のパスを認識しないことがあります。

以下は私のプロジェクトのディレクトリ構造です:

/project/apps/..
/project/tests/..

私は以下のコマンドを実行していました:

>> cd project

>> python tests/my_test.py

上記のコマンドを実行した後、エラーが発生しました

no module named lib

libはmy_test.pyにインポートされました

私はsys.pathを印刷し、私が取り組んでいるプロジェクトのパスがsys.pathリストで利用できないことを理解しました

スクリプトの先頭に以下のコードを追加しましたmy_test.py

import sys
import os

module_path = os.path.abspath(os.getcwd())    

if module_path not in sys.path:       

    sys.path.append(module_path)

それがそれを解決する良い方法であるかどうかはわかりませんが、ええ、それは私にとってうまくいきました。


これは、常に同じ場所からスクリプトを実行する場合に機能します。そうしos.getcwd()ないと、スクリプトファイルが存在するディレクトリではなく、スクリプトが実行されたディレクトリを取得するため、問題が発生します。
Nathan Arthur

1

これは私がそれを修正した方法です:

import os
import sys
module_path = os.path.abspath(os.getcwd() + '\\..')
if module_path not in sys.path:
    sys.path.append(module_path)

1

この問題の解決策は、ここで広範囲に文書化されていることがわかりました。

https://jakevdp.github.io/blog/2017/12/05/installing-python-packages-from-jupyter/

基本的に、Jupyter環境内にパッケージをインストールし、次のようなシェルコマンドを発行する必要があります。

!{sys.executable} -m pip install numpy

信頼できる完全な回答については、上記のリンクを確認してください。


0

私はこの矛盾のさらに別の原因を発見しました:

ローカルと一般的にvirtualenvsの両方にipythonをインストールしています。私の問題は、ipythonで新しく作成されたvirtualenv内で、virtualenv(2.7.x対3.5.x)のpythonおよびipythonとは異なるバージョンであるシステムipythonが取得され、それにより陽気が続いたことでした。

バイナリが含まれるものをインストールするときは常に、適切なpython / ipythonが取得されるように、使用しているシェルに対してyourvirtualenv/binすぐに実行するrehashか、または同様のことを行うのが賢明だと思います。(適切なpipポストインストールフックがあるかどうか確認する必要があります...)


0

スクリプトなしのソリューション:

  1. Spyder-> Tools-> PYTHONPATH managerを開きます
  2. [パスを追加]をクリックしてPythonパスを追加します。例: 'C:\ Users \ User \ AppData \ Local \ Programs \ Python \ Python37 \ Lib \ site-packages'
  3. [同期...]をクリックして、他のプログラム(Jupyter Notebookなど)がステップ2で設定したpythonpathsを使用できるようにします。
  4. Jupyterが開いている場合は再起動します

0

これはおそらく、システムインストールされている異なるpythonバージョン、つまりpython2またはpython3が原因です。です。

コマンド$ pip --versionを実行して、Python 3xのpip$ pip3 --versionを確認します。たとえば、次のようなバージョン情報が表示されます。

pip 19.0.3 from /usr/local/lib/python3.7/site-packages/pip (python 3.7)

次にexample.py、以下のコマンドでスクリプトを実行します

$ python3 example.py

0

ディレクトリで私に起こったutils。このディレクトリを次のようにインポートしようとしました:

from utils import somefile

utilsはすでにpythonのパッケージです。ディレクトリ名を別の名前に変更するだけで、問題なく機能するはずです。


0

この種のエラーは、おそらくpythonバージョンの競合が原因で発生します。たとえば、アプリケーションがpython 3でのみ実行され、python 2も取得している場合は、使用するバージョンを指定することをお勧めします。たとえば使用

python3 .....

の代わりに

python



-1

それを削除pathlibして再インストールします。sitepackagesフォルダー内のpathlibを削除し、pipコマンドを使用してpathlibパッケージを再インストールします。

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