我试图运行一个脚本,启动,除其他外,一个python脚本。我得到一个ImportError:没有模块命名为…但是,如果我启动ipython并通过解释器以相同的方式导入相同的模块,则该模块将被接受。
发生了什么事,我该怎么解决?我试图理解python如何使用PYTHONPATH,但我完全困惑了。任何帮助都将不胜感激。
我试图运行一个脚本,启动,除其他外,一个python脚本。我得到一个ImportError:没有模块命名为…但是,如果我启动ipython并通过解释器以相同的方式导入相同的模块,则该模块将被接受。
发生了什么事,我该怎么解决?我试图理解python如何使用PYTHONPATH,但我完全困惑了。任何帮助都将不胜感激。
当前回答
这可能是由于系统上安装了不同的python版本,即python2或python3。
运行命令$ pip——version和$ pip3——version检查哪个pip来自Python 3x。例如,你应该看到如下版本信息:
pip 19.0.3 from /usr/local/lib/python3.7/site-packages/pip (python 3.7)
然后使用以下命令运行example.py脚本
$ python3 example.py
其他回答
确保它们都使用相同的解释器。我在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]
和系统。两位译员的路线不同。为了解决这个问题,我删除了Python 3.3。
这个问题的出现是由于命令行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或Windows详细讨论。
如果有人在MSVS Code中使用conda和Jupyter Notebook时遇到这个问题,解决方案是确保您使用了正确的内核。内核位于界面右上角的一个框中,看起来像这样:
我将我的Python版本指向与我的应用程序路径匹配的Python版本——问题解决了!
如果你从命令行运行它,有时候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)
我不确定这是不是解决问题的好方法,但对我来说确实有效。
我是这样解决的:
import os
import sys
module_path = os.path.abspath(os.getcwd() + '\\..')
if module_path not in sys.path:
sys.path.append(module_path)