2013-03-20 121 views
78

我试图运行一个脚本,它启动了一个python脚本。我得到一个ImportError:No module named ...,但是,如果我通过解释器启动ipython并以相同的方式导入相同的模块,那么该模块将被接受。尝试运行Python脚本时出现“ImportError:No module named”

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

+4

您需要提供更多信息。当你说“运行一个脚本”,你的意思是一个shell脚本?你不能导入哪个模块?该模块位于何处?你的脚本在哪里? – BrenBarn 2013-03-20 03:11:42

+2

如果你想得到“正在发生什么”的确定性答案,用'-v'选项启动python,你会看到python在哪里(或不在)找到你导入的模块。 – FatalError 2013-03-20 03:13:42

+0

你想要导入什么?两个python脚本在同一个目录中吗? – pynovice 2013-03-20 03:50:08

回答

100

这个问题的出现是由于在命令行解释器的IPython使用您当前的路径与方式的方式单独的进程确实(可以是一个IPython的笔记本电脑,外部进程等)。 IPython将查找不仅可以在您的sys.path中找到的模块,而且还可以在当前的工作目录中找到这些模块。当开始在命令行解释器,你在运行当前目录是您在启动IPython中的相同。如果你运行

import os 
os.getcwd() 

你会看到这是真的。

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

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

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

import module-of-interest 

如果不工作,你已经有了一个不同的问题,在您的手中无关的路径来导入,你应该提供问题的详细信息。

更好(更永久的)的方式来解决这个问题是设置PYTHONPATH,它提供了解释与其他目录中查找Python软件包/模块。编辑或设置PYTHONPATH作为全局变量取决于操作系统,在此处对UnixWindows进行了详细讨论。

+1

谢谢。解决了我的问题。 – Aditya 2015-08-20 10:28:23

+0

PSA:如果你已经来到这个SO问题,因为你在jupyter-notebook中出现这个错误,那么请看下面,https://stackoverflow.com/a/27944947/127971不幸的是,这个问题还不够具体一个答案。 – michael 2017-07-15 19:45:16

+0

@michael这个答案是关于在一般情况下导入Python模块的;当解释器搜索要导入的模块的目录时,dunder init.py文件是必需的,或者不是。以上关于笔记本解释器工作目录和设置PYTHONPATH的答案是正确的。 – BoltzmannBrain 2017-07-15 19:58:02

2

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

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

4

sys.path.append('my-path-to-module-folder')的工作,但要避免要使用该模块每次都做到这一点在IPython中,你可以添加export PYTHONPATH="my-path-to-module-folder:$PYTHONPATH"~/.bash_profile文件。

10

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

+0

'__init.py__'表示'\ __ init \ __。py',对吧? 我创建了\ __ init \ __。py作为一个空文件,它为我工作。非常感谢。 但为什么这需要?在与我的ipython笔记本相同的目录中有一个python脚本并且导入工作正常之前, – 2015-11-18 12:49:32

+1

是的,正好@EduardoReis ,.实际上我只把__init__.py,但我不知道为什么利益冲突不支持它。 – 2015-11-19 06:38:37

+2

实际上,__init__.py用于指示python以指示在该相应位置包含某个包。那么只有它会发现无论你在它下面创建的子模块。如果你不创建'_init_.py'意味着python不知道里面有一些软件包。例如:从“Myfolder.Mypackage import Mymodules”这个例如,你应该启动__init__.py来指示python告诉这里有一些包。否则它不知道。 – 2015-11-19 06:48:15

8

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

+0

已经使用miniconda安装了一堆python相关东西我也得到了这个问题。捆绑的ubuntu python 2.7与miniconda python 2.7不同。这个答案允许我解决问题 – bph 2016-02-24 21:51:10

+3

这是我的问题。我已升级到Python 2.7.11,但我的iPython交互式shell仍在使用2.7.5。我只需要运行'pip install --upgrade ipython'来获取最新版本,然后默认自动使用2.7.11。 – Abundnce10 2016-05-03 17:46:13

0

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

3

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

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

conda install opencv

安装OpenCV的时候,得到了在IPython中导入错误,有三个步骤来解决这个问题:

import cv2 
ImportError: ... 

1.检查路径在Python和IPython都用下面的命令

import sys 
sys.path 

你会发现它们是不同的结果。第二步,只需使用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 

在六,附加到文件:

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

DONE

-1

删除pathlib并重新安装。

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

PIP安装pathlib

-1

这是我如何固定它:

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

我发现这种差异的又一来源:

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

我认为在安装yourvirtualenv/bin中的二进制文件时要做的事情是,立即运行rehash或类似的shell,以便正确使用python/ipython。 (请检查是否有合适的pip安装后挂钩...)

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) 

我不知道这是否是解决它的一个很好的方式,但是它确实为我工作。

相关问题