我试图运行一个启动python脚本的脚本。我得到一个ImportError:没有名为...的模块,但是,如果我启动ipython并通过解释器以相同的方式导入相同的模块,则接受该模块。
发生了什么,我该如何解决?我试图了解python如何使用PYTHONPATH,但我完全糊涂了。任何帮助将非常感谢。
答案 0 :(得分:143)
出现此问题的原因是命令行IPython解释器使用当前路径的方式与单独进程的方式(无论是IPython笔记本,外部进程等)。 IPython将查找要导入的模块,这些模块不仅可以在sys.path中找到,还可以在当前的工作目录中找到。从命令行启动解释器时,您正在操作的当前目录与您在ipython中启动的目录相同。如果您运行
import os
os.getcwd()
你会看到这是真的。
但是,假设你正在使用ipython笔记本,运行os.getcwd()
,而你当前的工作目录就是你在ipython_notebook_config.py文件中告诉笔记本操作的文件夹(通常使用{ {1}}设置)。
解决方案是为python解释器提供路径到您的模块。最简单的解决方案是将该路径附加到sys.path列表中。在笔记本中,首先尝试:
c.NotebookManager.notebook_dir
如果这不起作用,那么你的手上会遇到与导入路径无关的问题,你应该提供更多关于你的问题的信息。
更好(也更永久)的解决方法是设置 PYTHONPATH ,它为解释器提供了python包/模块的其他目录。将PYTHONPATH编辑或设置为全局变量是依赖于os的,这里将详细讨论Unix或Windows。
答案 1 :(得分:12)
在运行python项目时,只需在显示错误的文件夹下创建一个名为__init__.py
的空python文件。
答案 2 :(得分:9)
确保他们都使用相同的解释器。在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。
答案 3 :(得分:6)
执行sys.path.append('my-path-to-module-folder')
会有效,但为了避免每次要使用模块时都必须在IPython中执行此操作,您可以将export PYTHONPATH="my-path-to-module-folder:$PYTHONPATH"
添加到~/.bash_profile
文件中。
答案 4 :(得分:5)
主要原因是Python和IPython的sys.paths不同。
请参阅lucypark link,解决方案适用于我的情况。它通过
安装opencv时发生 conda install opencv
在iPython中出现导入错误,解决此问题有三个步骤:
import cv2
ImportError: ...
<强> 1。使用以下命令检查Python和iPython中的路径
import sys
sys.path
你会发现它们的结果不同。第二步,只需使用sys.path.append
通过try-and-error修复错过的路径。
<强> 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
在vi中,附加到文件:
c.InteractiveShellApp.exec_lines = [
'import sys; sys.path.append("/home/osboxes/miniconda2/lib/python2.7/site-packages")'
]
DONE
答案 5 :(得分:2)
在安装ipython之前,我通过easy_install安装了模块;说sudo easy_install mechanize
。
安装ipython后,我不得不重新运行easy_install以便ipython识别模块。
答案 6 :(得分: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)
我不确定这是否是解决问题的好方法,但是它确实适用于我。
答案 7 :(得分:0)
导入系统 sys.path.append('/ Users / {user} /Library/Python/3.7/lib/python/site-packages') 导入ta
答案 8 :(得分:0)
此答案是否适用于此问题
下面的路径可以是相对的
PYTHONPATH=/path/to/dir python script.py
答案 9 :(得分:0)
这种错误很可能是由于python版本冲突而发生的。例如,如果您的应用程序仅在python 3上运行,并且您也获得了python 2,那么最好指定要使用的版本。 例如使用
python3 .....
代替
python
答案 10 :(得分:0)
出现在目录utils
上。我试图将此目录导入为:
from utils import somefile
utils
已经是python中的软件包。只需将目录名称更改为其他名称,它应该可以正常工作。
答案 11 :(得分:0)
我发现此问题的解决方案已在此处广泛记录:
https://jakevdp.github.io/blog/2017/12/05/installing-python-packages-from-jupyter/
基本上,您必须在Jupyter环境中安装软件包,并发出如下shell命令:
!{sys.executable} -m pip install numpy
请检查上面的链接以获得权威的完整答案。
答案 12 :(得分:0)
这可能是由系统上安装的不同python版本引起的,即 python2 或 python3 。
运行命令$ pip --version
和$ pip3 --version
,以检查在 Python 3x 中来自哪个 pip 。例如。您应该看到如下版本信息:
pip 19.0.3 from /usr/local/lib/python3.7/site-packages/pip (python 3.7)
然后使用以下命令运行example.py
脚本
$ python3 example.py
答案 13 :(得分:0)
无需编写脚本的解决方案:
答案 14 :(得分:0)
我发现了这种差异的另一个来源:
我已经在本地和通常在virtualenvs中安装了ipython。我的问题是,在一个新制作的带有ipython的virtualenv中,系统ipython被选中,这是与virtualenv中的python和ipython不同的版本(2.7.x对3.5.x),并且随之而来的是欢闹。
我认为在yourvirtualenv/bin
中安装具有二进制文件的东西时,聪明的做法是立即运行rehash
或类似的任何shell,以便选择正确的python / ipython起来。 (要检查是否有合适的pip
安装后挂钩......)
答案 15 :(得分:0)
这就是我修复它的方法:
import os
import sys
module_path = os.path.abspath(os.getcwd() + '\\..')
if module_path not in sys.path:
sys.path.append(module_path)
答案 16 :(得分:0)
有一个类似的问题,通过调用python3
而不是python
修复它,我的模块在Python3.5中。
答案 17 :(得分:-1)
删除pathlib并重新安装。
删除sitepackages文件夹中的pathlib,并使用pip命令重新安装pathlib包。
pip install pathlib