簡體   English   中英

嘗試運行 Python 腳本時出現“ImportError: No module named”

[英]"ImportError: No module named" when trying to run Python script

我正在嘗試運行一個腳本來啟動 python 腳本等。 我得到一個 ImportError: No module named...,但是,如果我啟動 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 解釋器提供模塊路徑。 最簡單的解決方案是將 append 該路徑指向您的 sys.path 列表。 在您的筆記本中,首先嘗試:

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

如果這不起作用,則您手上遇到了與導入路徑無關的不同問題,您應該提供有關您的問題的更多信息。

解決這個問題的更好(和更永久)的方法是設置你的PYTHONPATH ,它為解釋器提供了額外的目錄來查找 python 包/模塊。 將 PYTHONPATH 編輯或設置為全局變量取決於操作系統,此處針對UnixWindows進行了詳細討論。

運行 python 項目時,只需在顯示錯誤的文件夾下創建一個名為__init__.py的空 python 文件。

確保他們都使用相同的解釋器。 這在 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是不同的。 為了修復它,我刪除了 Python 3.3。

The main reason is the sys.paths of Python and IPython are different.

Please refer to lucypark link, the solution works in my case. It happen when install opencv by

conda install opencv

And got import error in iPython, There are three steps to solve this issue:

import cv2
ImportError: ...

1. Check path in Python and iPython with following command

import sys
sys.path

You will find different result from Python and Jupyter. Second step, just use sys.path.append to fix the missed path by try-and-error.

2. Temporary solution

In iPython:

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

the ImportError:.. issue solved

3. Permanent solution

Create an iPython profile and set initial append:

In bash shell:

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

In vi, append to the file:

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

DONE

執行sys.path.append('my-path-to-module-folder')將起作用,但為了避免每次要使用模塊時都必須在 IPython 中執行此操作,可以添加export PYTHONPATH="my-path-to-module-folder:$PYTHONPATH"到您的~/.bash_profile文件。

這就是我修復它的方法:

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

在安裝ipython之前,我通過easy_install安裝了模塊; sudo easy_install mechanize

安裝 ipython 后,我不得不重新運行 easy_install 以便 ipython 識別模塊。

如果您從命令行運行它,有時 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 環境中安裝軟件包,發出 shell 命令,例如:

 .{sys executable} -m pip install numpy

請檢查上面的鏈接以獲得權威的完整答案。

出現這種錯誤很可能是由於 python 版本沖突。 例如,如果您的應用程序僅在 python 3 上運行並且您也獲得了 python 2,那么最好指定要使用的版本。 例如使用

python3.....

代替

python

有類似的問題,通過調用python3而不是python來修復它,我的模塊在 Python3.5 中。

我發現了這種差異的另一個來源:

我在本地和通常在 virtualenvs 中都安裝了 ipython。 我的問題是,在一個新制作的帶有 ipython 的 virtualenv 中,系統 ipython 被拾取,它與 virtualenv 中的 python 和 ipython 不同版本(2.7.x 與 3.5.x),然后歡鬧。

我認為,每當安裝將在yourvirtualenv/bin中包含二進制文件的東西時,明智的做法是立即對您正在使用的任何 shell 運行rehash或類似操作,以便獲取正確的 python/ipython。 (要檢查是否有合適的pip安裝后掛鈎...)

沒有腳本的解決方案:

  1. 打開 Spyder -> 工具 -> PYTHONPATH 管理器
  2. 通過單擊“添加路徑”添加 Python 路徑。 例如:'C:\Users\User\AppData\Local\Programs\Python\Python37\Lib\site-packages'
  3. 單擊“同步...”以允許其他程序(例如 Jupyter Notebook)使用在步驟 2 中設置的 pythonpaths。
  4. 如果 Jupyter 已打開,請重新啟動它

這可能是由於您的系統上安裝了不同的 python 版本,即python2python3造成的。

運行命令$ 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

目錄utils發生在我身上。 我試圖將此目錄導入為:

 from utils import somefile

utils已經是 python 中的 package。 只需將您的目錄名稱更改為不同的名稱,它應該可以正常工作。

這個答案適用於這個問題,如果

  1. 您不想更改代碼
  2. 您不想永久更改 PYTHONPATH

臨時修改 PYTHONPATH

下面的路徑可以是相對的

PYTHONPATH=/path/to/dir python script.py
 import sys sys.path.append('/Users/{user}/Library/Python/3.7/lib/python/site-packages') import ta

如果有人在 MSVS 代碼中使用帶有conda Notebook 的 conda 遇到此問題,解決方案是確保您使用正確的 kernel。 kernel 在界面右上角的一個方框中,如下所示:

在此處輸入圖像描述

我指出我的 Python 版本也與我的應用程序路徑匹配——問題已解決

出現此問題是由於版本不同 - 例如,如果您機器上安裝的 Python 安裝在名為path_to_lib/python3.6的文件夾中,但您的筆記本運行在Python 3 - 命名中的間距很重要

如何解決?

創建新的 jupyter notebook 時,只需選擇與您的版本相同的 Python(注意空格。)。 見附圖

選擇正確的 Python 版本控制

這對我有用:我剛剛更改了筆記本中的工作目錄

import os os.chdir("my/path/to/module") os.getcwd()

我的 Jupyter Lab 設置也有類似問題,我通過檢查 Jupyter Lab 打開時的日志解決了這個問題。 這告訴我虛擬環境 (pipenv) 無法找到 Jupyter Lab,因此它使用了共享版本(來自早期安裝的 Python)。

我創建了一個 requirements.txt,發現我沒有在這個新環境中安裝 Jupyter Lab。 安裝它解決了導入錯誤。

刪除pathlib並重新安裝它。 刪除sitepackages文件夾中的 pathlib 並使用 pip 命令重新安裝 pathlib package:

 pip install pathlib

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM