尝试运行Python脚本时出现“ImportError:No module named”
我试图运行一个脚本,它启动了一个python脚本。我得到一个ImportError:No module named ...,但是,如果我通过解释器启动ipython并以相同的方式导入相同的模块,那么该模块将被接受。尝试运行Python脚本时出现“ImportError:No module named”
这是怎么回事,我该如何解决?我试图了解python如何使用PYTHONPATH,但我完全困惑。任何帮助将不胜感激。
这个问题的出现是由于在命令行解释器的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作为全局变量取决于操作系统,在此处对Unix或Windows进行了详细讨论。
谢谢。解决了我的问题。 – Aditya 2015-08-20 10:28:23
PSA:如果你已经来到这个SO问题,因为你在jupyter-notebook中出现这个错误,那么请看下面,https://stackoverflow.com/a/27944947/127971不幸的是,这个问题还不够具体一个答案。 – michael 2017-07-15 19:45:16
@michael这个答案是关于在一般情况下导入Python模块的;当解释器搜索要导入的模块的目录时,dunder init.py文件是必需的,或者不是。以上关于笔记本解释器工作目录和设置PYTHONPATH的答案是正确的。 – BoltzmannBrain 2017-07-15 19:58:02
在安装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文件。
'__init.py__'表示'\ __ init \ __。py',对吧? 我创建了\ __ init \ __。py作为一个空文件,它为我工作。非常感谢。 但为什么这需要?在与我的ipython笔记本相同的目录中有一个python脚本并且导入工作正常之前, – 2015-11-18 12:49:32
是的,正好@EduardoReis ,.实际上我只把__init__.py,但我不知道为什么利益冲突不支持它。 – 2015-11-19 06:38:37
实际上,__init__.py用于指示python以指示在该相应位置包含某个包。那么只有它会发现无论你在它下面创建的子模块。如果你不创建'_init_.py'意味着python不知道里面有一些软件包。例如:从“Myfolder.Mypackage import Mymodules”这个例如,你应该启动__init__.py来指示python告诉这里有一些包。否则它不知道。 – 2015-11-19 06:48:15
确保它们都使用相同的解释器。这发生在我在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。
已经使用miniconda安装了一堆python相关东西我也得到了这个问题。捆绑的ubuntu python 2.7与miniconda python 2.7不同。这个答案允许我解决问题 – bph 2016-02-24 21:51:10
这是我的问题。我已升级到Python 2.7.11,但我的iPython交互式shell仍在使用2.7.5。我只需要运行'pip install --upgrade ipython'来获取最新版本,然后默认自动使用2.7.11。 – Abundnce10 2016-05-03 17:46:13
有类似的问题,通过调用python3
而不是python
修复它,我的模块在Python3.5。
主要原因是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
删除pathlib并重新安装。
删除sitepackages文件夹中的pathlib,并使用pip命令重新安装pathlib软件包。
PIP安装pathlib
这是我如何固定它:
import os
import sys
module_path = os.path.abspath(os.getcwd() + '\\..')
if module_path not in sys.path:
sys.path.append(module_path)
我发现这种差异的又一来源:
我已经IPython都安装在本地和常用的virtualenvs。我的问题是,在新制作的带有ipython的virtualenv中,系统ipython被选中,这是与virtualenv(2.7.x和3.5.x)中的python和ipython不同的版本,并且随之而来的是欢快。
我认为在安装yourvirtualenv/bin
中的二进制文件时要做的事情是,立即运行rehash
或类似的shell,以便正确使用python/ipython。 (请检查是否有合适的pip
安装后挂钩...)
如果您是从命令行运行它,有时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)
我不知道这是否是解决它的一个很好的方式,但是它确实为我工作。
您需要提供更多信息。当你说“运行一个脚本”,你的意思是一个shell脚本?你不能导入哪个模块?该模块位于何处?你的脚本在哪里? – BrenBarn 2013-03-20 03:11:42
如果你想得到“正在发生什么”的确定性答案,用'-v'选项启动python,你会看到python在哪里(或不在)找到你导入的模块。 – FatalError 2013-03-20 03:13:42
你想要导入什么?两个python脚本在同一个目录中吗? – pynovice 2013-03-20 03:50:08