安装成功后的ImportError
ImportError after successful pip installation
在安装完库之后,出现ImportError的问题通常是因为系统中存在多个版本的Python解释器和pip版本。使用python -m pip install <library-name>
而不是pip install <library-name>
可以确保库被安装到默认的Python解释器中。
需要注意的是,个人经验建议不要使用sudo pip install
将包安装到系统默认的Python解释器中,这可能会导致各种混乱的问题。如果有需要,请先检查是否可以使用virtualenv。
现代系统通常会预装多个Python解释器。每个解释器都维护着自己安装的库的集合。在安装新的库时,了解这些库实际上被安装到哪个解释器中非常重要。
在Unix系统中,可以使用shell来了解发生了什么。输入which -a python
可以显示PATH中的所有解释器。第一行对应着在命令行中运行python
时使用的解释器。
/private/tmp/py32/bin/python /usr/local/bin/python /usr/bin/python
每个pip版本都属于一个解释器。输入which -a pip
可以显示所有pip版本。同样,第一行是在shell中输入pip
时将调用的版本。
/usr/local/bin/pip /usr/bin/python
需要注意的是,在这种情况下,python
属于安装在/private/tmp/py32/
中的解释器,但pip
安装到了/usr/local/bin
中的解释器。在成功安装库之后,您将无法在默认的Python解释器中导入它。
那么如何导入已安装的库呢?
第一种方法是使用完整路径启动所需的解释器。所以,如果您输入/usr/local/bin/python
,您将能够导入该库。
第二种(通常更受欢迎)的方法是明确调用正确的pip版本。为此,您可以使用python -m pip install <library-name>
而不是pip install <library-name>
。这将调用属于默认Python解释器的pip版本。
现代系统中有哪些拥有多个相同Python版本的情况呢?当您看到/usr/local/bin/python
时,通常意味着您自己安装了它。
我的观点是,并不仅仅只有一个python
,而是有多个Python解释器。通常情况下,默认安装了一个python2.x和一个python3.x解释器。嗯,也许我需要重新写一下,以使我的观点更清晰。
是的,在Unix上有默认的系统Python解释器,而不是默认安装了多个Python2或3解释器,如果您看到其他解释器,那通常意味着您自己安装了它们,which -a python
应该返回一个路径,新安装时应该非常明确,您不应该触碰默认的Python解释器。如果您不知道自己在做什么,最好使用virtualenv或pyenv。
Cunningham认同使用virtualenvs
而不是触碰system
的Python是最好的方式。然而,许多人仍然方便地使用sudo pip install
。我不认为将其安装到系统Python中是可怕的。毕竟,在虚拟环境出现之前,我们可能都是这样做的。
当我想要使用不同版本的Python运行代码或测试新功能时,我使用pyenv;对于其他所有情况,我使用系统Python,因为我对所有的工作原理有很好的了解。但是这种理解是通过多年来多次破坏我的操作系统得来的,也是通过SO上的一些帖子,例如为什么apt-get不再工作了...一些人安装了多个Python版本,然后更改了默认版本,试图解决ImportError: No module named <library-name>的问题。
我会考虑添加一个指向virtualenv的免责声明。人们至少应该有一个参考,以避免破坏自己的系统的首选方法。您知道是否有一个问题-答案对,解释了为什么sudo pip install
是错误的,以及如何设置virtualenv
以避免破坏系统的Python吗?
对不起,我脑子里没有,我不认为sudo pip install
是邪恶的,我认为安装多个相同Python版本是问题所在。
我们在聊天中继续讨论吧。
对我来说,>>> sudo chown -R $USER /Library/Python/2.7 >>> python -m pip install <module>
解决了问题 🙂
which -a python
/home/coldshot/anaconda3/bin/python /usr/bin/python /bin/python 如果已经安装了mtcnn并且出现导入错误,则卸载mtcnn $ sudo -H pip uninstall mtcnn $ python -m pip install mtcnn 收集mtcnn 安装已收集的包:mtcnn 成功安装mtcnn-0.0.9
因此,在明确调用虚拟环境目录中的python
后,如果模块未导入,这是否意味着根本没有安装?讽刺的是,当我运行pip freeze
/ pip list
时,它显示已安装该版本的模块,所以这让人困惑。