190

我正在尝试运行一个脚本,该脚本会启动一个 python 脚本等。我得到一个 ImportError: No module named ...,但是,如果我启动 ipython 并通过解释器以相同的方式导入相同的模块,则该模块被接受。

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

4

20 回答 20

221

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

import os
os.getcwd() 

你会看到这是真的。

但是,假设您正在使用 ipython 笔记本,运行os.getcwd()并且您当前的工作目录是您在 ipython_notebook_config.py 文件中告诉笔记本进行操作的文件夹(通常使用c.NotebookManager.notebook_dir设置)。

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

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

import module_of_interest

如果这不起作用,则您手上遇到了与导入路径无关的不同问题,您应该提供有关您的问题的更多信息。

解决这个问题的更好(和更持久)的方法是设置你的PYTHONPATH,它为解释器提供了额外的目录来查找 python 包/模块。将 PYTHONPATH 编辑或设置为全局变量取决于操作系统,此处针对UnixWindows进行了详细讨论。

于 2013-03-25T18:24:42.613 回答
18

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

于 2015-01-14T14:11:26.163 回答
17

确保他们都使用相同的解释器。这在 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。

于 2015-07-24T01:08:40.487 回答
9

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

请参考lucypark 链接,该解决方案适用于我的情况。它发生在安装opencv时

conda install opencv

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

import cv2
ImportError: ...

1. 使用以下命令检查 Python 和 iPython 中的路径

import sys
sys.path

你会发现 Python 和 Jupyter 的结果不同。第二步,只需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")'
]

完毕

于 2016-10-20T15:27:26.610 回答
6

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

于 2014-07-29T18:37:11.677 回答
3

这就是我修复它的方法:

import os
import sys
module_path = os.path.abspath(os.getcwd() + '\\..')
if module_path not in sys.path:
    sys.path.append(module_path)
于 2017-06-14T22:07:19.443 回答
2

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

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

于 2013-10-01T19:40:03.903 回答
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)

我不确定这是否是解决它的好方法,但它确实对我有用。

于 2017-09-11T10:21:16.930 回答
2

我发现这个问题的解决方案在这里被广泛记录:

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

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

!{sys.executable} -m pip install numpy

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

于 2019-05-22T00:02:18.643 回答
2

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

python3 .....

代替

python
于 2019-09-07T18:52:27.203 回答
1

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

于 2016-05-01T21:38:21.790 回答
0

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

我在本地和通常在 virtualenvs 中都安装了 ipython。我的问题是,在一个新制作的带有 ipython 的 virtualenv 中,系统 ipython 被拾取,它与 virtualenv 中的 python 和 ipython 版本不同(2.7.x 与 3.5.x),然后是欢闹。

我认为,每当安装包含二进制文件的东西时,明智的做法yourvirtualenv/bin是立即rehash为您使用的任何 shell 运行或类似的操作,以便获取正确的 python/ipython。(必须检查是否有合适pip的安装后挂钩......)

于 2017-07-12T09:59:55.860 回答
0

没有脚本的解决方案:

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

这可能是由于您的系统上安装了不同的 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
于 2019-04-10T06:35:28.823 回答
0

目录发生在我身上utils。我试图将此目录导入为:

from utils import somefile

utils已经是python中的一个包。只需将您的目录名称更改为不同的名称,它应该可以正常工作。

于 2019-09-03T19:55:31.203 回答
0

这个答案适用于这个问题,如果

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

临时修改 PYTHONPATH

下面的路径可以是相对的

PYTHONPATH=/path/to/dir python script.py
于 2020-02-12T19:33:27.510 回答
0
import sys
sys.path.append('/Users/{user}/Library/Python/3.7/lib/python/site-packages')
import ta
于 2020-03-04T16:39:19.740 回答
0

如果有人在 MSVS 代码中使用 Jupyter Notebook 遇到此问题conda,解决方案是确保您使用的是正确的内核。内核位于界面右上角的一个框中,如下所示:

在此处输入图像描述

我指出我的 Python 版本也与我的应用程序路径匹配——问题解决了!

于 2021-08-21T21:29:11.570 回答
0

这个问题是由于不同的版本导致的——例如,如果你机器上安装的 Python 安装在一个名为path_to_lib/python3.6但你的 notebook 正在运行的文件夹中Python 3——命名中的间距很重要!

如何解决?

创建新的 jupyter notebook 时,只需选择与您的版本相同的 Python(注意空格!)。见附图。

选择正确的 Python 版本控制

于 2022-03-02T11:03:59.353 回答
-1

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

pip install pathlib
于 2017-06-05T05:22:48.370 回答