私は、とりわけPythonスクリプトを起動するスクリプトを実行しようとしています。 ImportError:という名前のモジュールはありません...しかし、ipythonを起動してインタープリタを介して同じ方法で同じモジュールをインポートすると、そのモジュールは受け入れられます。
何が起こっていますか、そしてどのように修正できますか?私はpythonがPYTHONPATHをどのように使用するかを理解しようとしましたが、私は完全に混乱しています。任意の助けは大歓迎です。
この問題は、コマンドラインの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を設定することです。モジュールPYTHONPATHをグローバル変数として編集または設定することは、依存しているので、 nix または Windows について詳しく説明します。
Pythonプロジェクトを実行している間に、エラーが表示されているフォルダーの下に__init__.py
という名前の空のpythonファイルを作成するだけです。
両方が同じインタプリタを使用していることを確認してください。これはUbuntuで私に起こりました:
$ ipython3
> sys.version
'3.4.2 (default, Jun 19 2015, 11:34:49) \n[GCC 4.9.1]'
$ python3
> sys.version
'3.3.0 (default, Nov 27 2012, 12:11:06) \n[GCC 4.6.3]'
そしてsys.path
は2つのインタプリタの間で異なっていました。それを修正するために、私はPython 3.3を削除しました。
sys.path.append('my-path-to-module-folder')
を実行しても機能しますが、モジュールを使用するたびにIPythonでこれを行わなくても済むように、export PYTHONPATH="my-path-to-module-folder:$PYTHONPATH"
ファイルに~/.bash_profile
を追加できます。
主な理由は、PythonとIPythonのsys.pathが異なることです
lucypark link を参照してください、解決策は私の場合はうまくいきます。でopencvをインストールすると起こります
conda install opencv
そしてiPythonでインポートエラーが発生しました、この問題を解決するための3つのステップがあります:
import cv2
ImportError: ...
1。次のコマンドでPythonとiPythonのパスを確認してください
import sys
sys.path
あなたはそれらが異なった結果であることに気付くべきです。 2番目のステップは、失敗したパスをtry-and-errorで修正するために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をインストールする前に、私はeasy_installを通してモジュールをインストールしました。 Sudo easy_install mechanize
と言います。
Ipythonをインストールした後、ipythonがモジュールを認識するようにeasy_installを再実行しなければなりませんでした。
コマンドラインから実行している場合、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)
それがそれを解決するための良い方法であるかどうか私にはわかりませんが、ええそれは私のためにうまくいきました。
私は、この問題に対する解決策がここに広く文書化されていることを発見しました:
https://jakevdp.github.io/blog/2017/12/05/installing-python-packages-from-jupyter/
基本的には、Jupyter環境内にパッケージをインストールして、以下のようなシェルコマンドを発行する必要があります。
!{sys.executable} -m pip install numpy
正式な全回答については、上記のリンクを確認してください。
私はこの矛盾のさらに別の原因を見つけました:
私はipythonをローカルでも一般的にもvirtualenvsにインストールしています。私の問題は、ipythonを使って新しく作られたvirtualenvの中で、システムipythonが選ばれたことです。これは、virtualenvの中のpythonやipythonとは異なるバージョン(2.7.x対3.5.x)で、ハイラリティが続きました。
私はyourvirtualenv/bin
にバイナリを含むものをインストールするときはいつでも賢いことは正しいpython/ipythonが拾われるようにあなたが使っているどんなシェルでもrehash
または同様のものを直ちに実行することであると思います。 (適切なpip
インストール後フックがあるかどうか確認してください...)
スクリプトなしの解決策:
これはおそらくシステムにインストールされているpythonのバージョンが異なるため、つまりpython2またはpythonです。
コマンド$ pip --version
および$ pip3 --version
を実行して、どのpipがPython 3xからのものであるかを確認します。例えば。以下のようなバージョン情報が表示されます。
pip 19.0.3 from /usr/local/lib/python3.7/site-packages/pip (python 3.7)
次に、以下のコマンドでexample.py
スクリプトを実行します。
$ python3 example.py
これは私がそれを修正した方法です:
import os
import sys
module_path = os.path.abspath(os.getcwd() + '\\..')
if module_path not in sys.path:
sys.path.append(module_path)
同様の問題がありました、python
の代わりにpython3
を呼び出すことによってそれを修正しました、私のモジュールはPython3.5にありました。