“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笔记本,运行
解决方案是向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项目时,只需在显示错误的文件夹下创建一个名为
确保他们都使用同一个解释器。我在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]' |
两个口译员之间的
执行
主要原因是python和ipython的sys.path不同。
请参阅lucypark链接,解决方案在我的情况下有效。安装opencv时
并且在ipython中出现了导入错误,解决这个问题有三个步骤:
1 2 | import cv2 ImportError: ... |
1。使用以下命令检查python和ipython中的路径
1 2 | import sys sys.path |
你应该发现它们是不同的结果。第二步,只需使用
2。临时解决方案
在IPython中:
1 2 3 | import sys sys.path.append('/home/osboxes/miniconda2/lib/python2.7/site-packages') import cv2 |
三。永久性解决方案
创建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之前,我通过简单的安装来安装模块,比如说
安装完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列表中不可用。
我在脚本
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。
运行命令
1 | pip 19.0.3 from /usr/local/lib/python3.7/site-packages/pip (python 3.7) |
然后用下面的命令运行
1 | $ python3 example.py |
不带脚本的解决方案:
我发现了这种差异的另一个来源:
我在本地和通常在virtualenvs中安装了ipython。我的问题是,在一个新制造的带有ipython的virtualenv中,系统ipython被选中了,它与virtualenv中的python和ipython是不同的版本(2.7.x对3.5.x),接着就是搞笑。
我认为,在
这就是我修复它的方法:
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) |
有一个类似的问题,通过调用
删除pathlib并重新安装。
删除SitePackages文件夹中的PathLib,然后使用pip命令重新安装PathLib包。
PIP安装路径库