尝试运行Python脚本时出现“ImportError:没有命名的模块”

时间:2013-03-20 03:10:19

标签: python ipython jupyter-notebook importerror

我试图运行一个启动python脚本的脚本。我得到一个ImportError:没有名为...的模块,但是,如果我启动ipython并通过解释器以相同的方式导入相同的模块,则接受该模块。

发生了什么,我该如何解决?我试图了解python如何使用PYTHONPATH,但我完全糊涂了。任何帮助将非常感谢。

18 个答案:

答案 0 :(得分:143)

出现此问题的原因是命令行IPython解释器使用当前路径的方式与单独进程的方式(无论是IPython笔记本,外部进程等)。 IPython将查找要导入的模块,这些模块不仅可以在sys.path中找到,还可以在当前的工作目录中找到。从命令行启动解释器时,您正在操作的当前目录与您在ipython中启动的目录相同。如果您运行

import os
os.getcwd() 

你会看到这是真的。

但是,假设你正在使用ipython笔记本,运行os.getcwd(),而你当前的工作目录就是你在ipython_notebook_config.py文件中告诉笔记本操作的文件夹(通常使用{ {1}}设置)。

解决方案是为python解释器提供路径到您的模块。最简单的解决方案是将该路径附加到sys.path列表中。在笔记本中,首先尝试:

c.NotebookManager.notebook_dir

如果这不起作用,那么你的手上会遇到与导入路径无关的问题,你应该提供更多关于你的问题的信息。

更好(也更永久)的解决方法是设置 PYTHONPATH ,它为解释器提供了python包/模块的其他目录。将PYTHONPATH编辑或设置为全局变量是依赖于os的,这里将详细讨论UnixWindows

答案 1 :(得分:12)

在运行python项目时,只需在显示错误的文件夹下创建一个名为__init__.py的空python文件。

答案 2 :(得分:9)

确保他们都使用相同的解释器。在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两个口译员之间有所不同。为了解决这个问题,我删除了Python 3.3。

答案 3 :(得分:6)

执行sys.path.append('my-path-to-module-folder')会有效,但为了避免每次要使用模块时都必须在IPython中执行此操作,您可以将export PYTHONPATH="my-path-to-module-folder:$PYTHONPATH"添加到~/.bash_profile文件中。

答案 4 :(得分:5)

主要原因是Python和IPython的sys.paths不同。

请参阅lucypark link,解决方案适用于我的情况。它通过

安装opencv时发生

conda install opencv

在iPython中出现导入错误,解决此问题有三个步骤:

import cv2
ImportError: ...

<强> 1。使用以下命令检查Python和iPython中的路径

import sys
sys.path

你会发现它们的结果不同。第二步,只需使用sys.path.append通过try-and-error修复错过的路径。

<强> 2。临时解决方案

在iPython中:

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

ImportError:..问题已解决

第3。永久解决方案

创建一个iPython配置文件并设置初始附加:

在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

在vi中,附加到文件:

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

DONE

答案 5 :(得分:2)

在安装ipython之前,我通过easy_install安装了模块;说sudo easy_install mechanize

安装ipython后,我不得不重新运行easy_install以便ipython识别模块。

答案 6 :(得分:1)

如果从命令行运行它,有时候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)

我不确定这是否是解决问题的好方法,但是它确实适用于我。

答案 7 :(得分:0)

导入系统 sys.path.append('/ Users / {user} /Library/Python/3.7/lib/python/site-packages') 导入ta

答案 8 :(得分:0)

此答案是否适用于此问题

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

Temporarily modify PYTHONPATH

下面的路径可以是相对的

PYTHONPATH=/path/to/dir python script.py

答案 9 :(得分:0)

这种错误很可能是由于python版本冲突而发生的。例如,如果您的应用程序仅在python 3上运行,并且您也获得了python 2,那么最好指定要使用的版本。 例如使用

python3 .....

代替

python

答案 10 :(得分:0)

出现在目录utils上。我试图将此目录导入为:

from utils import somefile

utils已经是python中的软件包。只需将目录名称更改为其他名称,它应该可以正常工作。

答案 11 :(得分:0)

我发现此问题的解决方案已在此处广泛记录:

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

基本上,您必须在Jupyter环境中安装软件包,并发出如下shell命令:

!{sys.executable} -m pip install numpy

请检查上面的链接以获得权威的完整答案。

答案 12 :(得分:0)

这可能是由系统上安装的不同python版本引起的,即 python2 python3

运行命令$ pip --version$ pip3 --version,以检查在 Python 3x 中来自哪个 pip 。例如。您应该看到如下版本信息:

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

然后使用以下命令运行example.py脚本

$ python3 example.py

答案 13 :(得分:0)

无需编写脚本的解决方案:

  1. 打开Spyder->工具-> PYTHONPATH管理器
  2. 通过单击“添加路径”来添加Python路径。 例如:“ C:\ Users \ User \ AppData \ Local \ Programs \ Python \ Python37 \ Lib \ site-packages”
  3. 点击“同步...”以允许其他程序(例如Jupyter Notebook)使用步骤2中设置的pythonpath。
  4. 如果Jupyter已打开,请重新启动

答案 14 :(得分:0)

我发现了这种差异的另一个来源:

我已经在本地和通常在virtualenvs中安装了ipython。我的问题是,在一个新制作的带有ipython的virtualenv中,系统ipython被选中,这是与virtualenv中的python和ipython不同的版本(2.7.x对3.5.x),并且随之而来的是欢闹。

我认为在yourvirtualenv/bin中安装具有二进制文件的东西时,聪明的做法是立即运行rehash或类似的任何shell,以便选择正确的python / ipython起来。 (要检查是否有合适的pip安装后挂钩......)

答案 15 :(得分:0)

这就是我修复它的方法:

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

答案 16 :(得分:0)

有一个类似的问题,通过调用python3而不是python修复它,我的模块在Python3.5中。

答案 17 :(得分:-1)

删除pathlib并重新安装。

删除sitepackages文件夹中的pathlib,并使用pip命令重新安装pathlib包。

pip install pathlib