ImportError:没有模块命名为;当试图运行Python脚本时

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

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

392897 次浏览

此问题的产生是由于命令行IPython解释器使用当前路径的方式与单独进程使用的方式不同(它是一个IPython笔记本,外部进程等)。IPython将寻找要导入的模块,而不仅仅是在你的sys。路径,但也在您的当前工作目录。当从命令行启动解释器时,您正在操作的当前目录与启动ipython时所在的目录相同。如果你跑了

import os
os.getcwd()

你会发现这是真的。

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

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

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


import module_of_interest

如果这不起作用,那么您就遇到了与导入路径无关的其他问题,您应该提供有关该问题的更多信息。

更好的(也是更永久的)解决方法是设置你的PYTHONPATH环境,它为解释器提供了额外的目录来查找python包/模块。编辑或设置PYTHONPATH为全局变量取决于操作系统,这里将详细讨论Unix窗户

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

在安装ipython之后,我必须为ipython重新运行easy_install以识别模块。

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

在运行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。

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

主要原因是系统。Python和IPython的路径不同。

请参考lucypark链接,解决方案在我的情况下工作。它发生在安装opencv by

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 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")'
]

完成

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

pip install pathlib

我是这样解决的:

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

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

我在本地和virtualenvs中都安装了ipython。我的问题是,在一个带有ipython的新创建的virtualenv中,系统ipython被选中,这与virtualenv中的python和ipython是不同的版本(2.7。X vs. a . 3. X),然后是笑声。

我认为在安装yourvirtualenv/bin中有二进制文件的东西时,聪明的做法是立即为你正在使用的任何shell运行rehash或类似的程序,以便获得正确的python/ipython。(必须检查是否有合适的pip安装后挂钩…)

如果你从命令行运行它,有时候python解释器不知道在哪里寻找模块。

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

/project/apps/..
/project/tests/..

我是按照命令运行的:

>> cd project


>> python tests/my_test.py

运行以上命令后,我得到以下错误

no module named lib

Lib在my_test.py中导入

我打印了sys。路径,并发现我正在工作的项目的路径在系统中不可用。路径列表

我在脚本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)

我不确定这是不是解决问题的好方法,但对我来说确实有效。

无需脚本的解决方案:

  1. 打开Spyder -> Tools -> PYTHONPATH管理器
  2. 通过单击“Add Path”添加Python路径。 例如:C: \ \用户用户\ AppData \本地Python \程序\ \ Python37 \ Lib \网站“李< / >
  3. 点击“同步…”允许其他程序(例如Jupyter Notebook)使用步骤2中设置的pythonpaths。
  4. 重启Jupyter,如果它是打开的

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

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

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

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

$ python3 example.py

我发现这个问题的解决方案在这里有大量的文档:

< a href = " https://jakevdp.github。Io /blog/2017/12/05/installing-python-packages-from-jupyter/" rel="nofollow noreferrer">https://jakevdp.github.io/blog/2017/12/05/installing-python-packages-from-jupyter/ .

基本上,你必须在Jupyter环境中安装包,发出shell命令,比如:

!{sys.executable} -m pip install numpy

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

发生在我的目录utils。我试图导入这个目录为:

from utils import somefile

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

这种错误很可能是由于python版本冲突引起的。例如,如果你的应用程序只在python 3上运行,而你也有python 2,那么最好指定使用哪个版本。 例如使用

python3 .....

而不是

python

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

  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 Code中使用Jupyter Notebook中的conda遇到这个问题,解决方案是确保你使用了正确的内核。内核位于界面右上角的一个框中,看起来像这样:

enter image description here

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

此问题的发生是由于不同的版本-例如,如果安装在您的机器上的Python安装在名为path_to_lib/python3.6的文件夹中,但您的笔记本电脑运行在Python 3中-命名中的空格很重要!

如何解决?

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

Choose correct Python versioning .

这对我来说很有效:我只是在笔记本中更改了我的工作目录

import os


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

我有一个类似的问题与我的Jupyter实验室设置,我通过检查Jupyter实验室日志打开解决。这告诉我,虚拟环境(pipenv)无法定位Jupyter Lab,所以它使用了一个共享版本(来自Python的早期安装)。

我创建了一个requirements.txt文件,发现我没有在这个新环境中安装Jupyter Lab。安装它解决了导入错误。