当试图运行Python脚本时,“ImportError:No module named”

我试图运行一个脚本启动,除其他外,一个Python脚本。 我得到一个ImportError:No module named …,但是,如果我通过解释器启动ipython并以相同的方式导入相同的模块,模块将被接受。

怎么回事,我该如何解决? 我试图了解Python如何使用PYTHONPATH,但我彻底困惑。 任何帮助将不胜感激。

出现此问题是由于命令行IPython解释器使用当前path与单独进程 (IPython笔记本,外部进程等)的方式。 IPython将查找不仅可以在您的sys.path中find的导入模块,还可以查找当前的工作目录。 从命令行启动解释器时,当前运行的目录与启动ipython时的目录相同。如果运行

 import os os.getcwd() 

你会看到这是事实。

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

解决scheme是提供python解释器的path到你的模块。 最简单的解决scheme是将该path附加到您的sys.path列表。 在你的笔记本上,先试试:

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

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

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

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

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

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

请参阅lucypark链接 ,解决scheme在我的情况下工作。 安装opencv时会发生这种情况

conda install opencv

并在iPython中导入错误,解决此问题有三个步骤:

 import cv2 ImportError: ... 

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

 import sys sys.path 

你会发现他们是不同的结果。 第二步,只需使用sys.path.append通过尝试错误来修复错过的path。

2.临时解决scheme

在iPython中:

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

ImportError:..问题解决了

永久的解决scheme

创build一个iPythonconfiguration文件并设置初始追加:

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

DONE

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

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

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

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

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

我有ipython安装在本地和通常在virtualenvs。 我的问题是,在一个新制作的带有ipython的virtualenv中,系统ipython被拿起来了,这个版本与virtualenv中的python和ipython是不同的版本(2.7.x和3.5.x版本),并且随之而来的是欢快的。

我认为在你的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,并找出我正在工作的项目的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) 

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

删除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)