关于ipython:尝试运行Python脚本时出现“ImportError:No module named”

“ImportError: No module named” when trying to run Python script

我正在尝试运行一个脚本,其中包括启动一个Python脚本。我得到一个导入错误:没有一个名为……的模块,但是,如果我通过解释器以相同的方式启动ipython并导入相同的模块,那么该模块就被接受。

发生了什么事,我怎么修理?我试图理解Python是如何使用pythonpath的,但我完全搞不清楚。任何帮助都将不胜感激。


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

1
2
import os
os.getcwd()

你会发现这是真的。

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

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

1
2
3
4
import sys
sys.path.append('my/path/to/module/folder')

import module-of-interest

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

解决这个问题的更好(更持久)方法是设置pythonpath,它为解释器提供了额外的目录来查找python包/模块。编辑或将pythonpath设置为全局var取决于操作系统,这里将详细讨论Unix或Windows。


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


确保他们都使用同一个解释器。我在Ubuntu遇到过这样的事:

1
2
3
4
5
6
7
8
9
$ ipython3
> sys.version
'3.4.2 (default, Jun 19 2015, 11:34:49)
[GCC 4.9.1]'


$ python3
> sys.version
'3.3.0 (default, Nov 27 2012, 12:11:06)
[GCC 4.6.3]'

两个口译员之间的sys.path是不同的。为了修复它,我删除了python3.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链接,解决方案在我的情况下有效。安装opencv时

conda install opencv

并且在ipython中出现了导入错误,解决这个问题有三个步骤:

1
2
import cv2
ImportError: ...

1。使用以下命令检查python和ipython中的路径

1
2
import sys
sys.path

你应该发现它们是不同的结果。第二步,只需使用sys.path.append通过尝试和错误来修复丢失的路径。

2。临时解决方案

在IPython中:

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

ImportError:..问题解决

三。永久性解决方案

创建IPython配置文件并设置初始附加:

在巴什贝壳中:

1
2
3
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中,附加到文件:

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

完成


在安装ipython之前,我通过简单的安装来安装模块,比如说sudo easy_install mechanize

安装完ipython之后,我必须重新运行easy-install for ipython来识别模块。


如果您是从命令行运行它,那么有时候Python解释器不知道在哪里查找模块。

以下是我的项目的目录结构:

1
2
/project/apps/..
/project/tests/..

我在命令下运行:

1
2
3
>> cd project

>> python tests/my_test.py

运行以上命令后,我出现以下错误

1
no module named lib

lib是在my_test.py中导入的。

我打印了sys.path并发现我正在处理的项目的路径在sys.path列表中不可用。

我在脚本my_test.py的开头添加了以下代码。

1
2
3
4
5
6
7
8
import sys
import os

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

if module_path not in sys.path:      

    sys.path.append(module_path)

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


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

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

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

然后用下面的命令运行example.py脚本

1
$ python3 example.py

不带脚本的解决方案:

  • 打开spyder->tools->pythonpath manager
  • 通过单击"添加路径"添加python路径。例如:"C:usersuserappdatalocalprogramspythonpython37libsite packages"
  • 单击"同步…"允许其他程序(如Jupyter笔记本)使用步骤2中设置的pythonpath。
  • 打开后重新启动Jupyter

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

    我在本地和通常在virtualenvs中安装了ipython。我的问题是,在一个新制造的带有ipython的virtualenv中,系统ipython被选中了,它与virtualenv中的python和ipython是不同的版本(2.7.x对3.5.x),接着就是搞笑。

    我认为,在yourvirtualenv/bin中安装二进制文件时,最明智的做法是立即运行rehash或类似于您使用的任何shell,以便正确地使用python/i python。(必须检查是否有合适的pip后安装挂钩…)


    这就是我修复它的方法:

    1
    2
    3
    4
    5
    import os
    import sys
    module_path = os.path.abspath(os.getcwd() + '\\..')
    if module_path not in sys.path:
        sys.path.append(module_path)


    有一个类似的问题,通过调用python3而不是python,解决了这个问题,我的模块在python3.5中。


    删除pathlib并重新安装。

    删除SitePackages文件夹中的PathLib,然后使用pip命令重新安装PathLib包。

    PIP安装路径库