【问题标题】:Python3 always shows ImportError messagePython3 总是显示 ImportError 消息
【发布时间】:2016-08-27 20:15:55
【问题描述】:

每当我尝试运行脚本时,python 解释器总是显示ImportError 消息,例如(例如)No module named 'setuptools'。因此,我尝试使用 apt-get 安装(或满足此要求)...我对 Python 2.7 和 Python 3.5 都执行此操作,直到 Requirement already satisfied

首先,我不使用 Python 2.7,但它是解释器的默认版本。那么,我该如何解决这个问题以使用 Python 3.5 呢?我试过这个:

>>> import sys
>>> print(sys.path)
['',
 '/usr/local/lib/python35.zip',
 '/usr/local/lib/python3.5',
 '/usr/local/lib/python3.5/plat-linux',
 '/usr/local/lib/python3.5/lib-dynload',
 '/usr/local/lib/python3.5/site-packages']

这是针对 Python3 的,对于 Python2 我做了同样的比较路径,我得到了这个:

>>> import sys
>>> print(sys.path)
['',
 '/usr/local/lib/python2.7/dist-packages/pygame-1.9.2b8-py2.7-linux-x86_64.egg',
 '/usr/lib/python2.7',
 '/usr/lib/python2.7/plat-x86_64-linux-gnu',
 '/usr/lib/python2.7/lib-tk',
 '/usr/lib/python2.7/lib-old',
 '/usr/lib/python2.7/lib-dynload',
 '/usr/local/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages/PILcompat',
 '/usr/lib/python2.7/dist-packages/gtk-2.0']

现在...如果我使用append() 方法将Python2 的所有路径添加到Python3 中的路径,它应该工作吗?另外,我曾考虑完全卸载 Python2,但我知道这会导致我的系统出现比我尝试解决的问题更多的问题。

【问题讨论】:

  • 这种情况会发生在 any 脚本中,还是仅在特定脚本中发生?
  • 我不认为这个问题与“如何安装 pip”是重复的。
  • 所有使用 Python3 以利用第三方模块的脚本都会发生这种情况。 @elethan

标签: python python-2.7 python-3.x pip importerror


【解决方案1】:

根据您对问题的描述,您可能一直在使用apt 和/或pip 安装所需的Python 2 版本的软件包。例如,sudo apt-get install python-django 将安装 Python 2 版本的 Django,而sudo apt-get install python3-django 将安装 Py3 版本。

您最终会遇到需要使用pip 的情况,因为您想要的软件包不会在 Debian/Ubuntu 存储库中。在这种情况下,请确保您使用的是正确的pip。尝试运行

pip -V

pip3 -V

在调用 pip 时查看附加了哪些 Python 版本,然后使用适合您希望定位的 Python 版本的版本。

最后,在任何情况下都应该将 Python 2 路径添加到 Python 3 的 sys.path


编辑

这是我在 Ubuntu 16.04 上使用系统的 Python 3.5.2 的sys.path

$ python3
Python 3.5.2 (default, Jul  5 2016, 12:43:10) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> from pprint import pprint as pp
>>> pp(sys.path)
['',
 '/usr/local/lib/python3.5/dist-packages/pandas-0.18.1-py3.5-linux-x86_64.egg',
 '/usr/local/lib/python3.5/dist-packages/github3.py-1.0.0a4-py3.5.egg',
 '/usr/local/lib/python3.5/dist-packages/uritemplate.py-0.3.0-py3.5.egg',
 '/usr/lib/python3/dist-packages',
 '/usr/lib/python35.zip',
 '/usr/lib/python3.5',
 '/usr/lib/python3.5/plat-x86_64-linux-gnu',
 '/usr/lib/python3.5/lib-dynload',
 '/usr/local/lib/python3.5/dist-packages']
>>> print(sys.executable)
/usr/bin/python3
>>>

您会注意到路径是 dist-packages 路径,而您有 site-packages。从用户的角度来看,两者之间几乎没有区别,所以不用担心。我还故意改变了我的一些路径(说来话长)。

【讨论】:

  • 没有。问题仍然存在。我总是使用pip3 安装软件包,apt-get 方法就像我最后的资源一样...此时,我不知道什么是正常的,但是当我 列出 pip 软件包时,它们是pip listpip3 list 中的所有相同包。此外,当我运行命令pip -Vpip3 -V 时,两个 命令的输出是相同的:pip 8.1.2 from /usr/local/lib/python3.5/dist-packages (python 3.5) 这就是让我认为问题出在路径上的原因。
  • @FranciscoGómez 你用的是 Ubuntu 还是 Debian?至少对于 Ubuntu,还应该有指向/usr/lib 的路径。我假设您使用的是系统的 Python 3 而不是手动安装?稍后我会发布我的完整路径。
  • 会是这个问题吗?我通过从源代码编译来安装它。我也在使用 Ubuntu 16.04。当我比较我们系统的路径时,我刚刚注意到的一件事是(在我的情况下)sys.path 指向:/usr/local/lib/,而路径/usr/lib/python3.5 /usr/lib/python3/dist-packages 不包括在内。 .. 使用append 方法添加此路径将解决问题?
  • @FranciscoGómez 你想自己编译 Python 有什么特别的原因吗?如果您在apt 中订阅xenial-updates,内容将会更新,包括Python 本身。我现在很高兴地从/usr/bin/python 运行最新版本(我喜欢新东西)。你有几个选择。您可以使用apt 升级Python(如有必要),然后将其指向/usr/local/lib/python3.5/dist-packages(它可能已经拾取),或者您可以修改您手工制作的Python 的sys.path 以指向/usr/lib 位置。跨度>
  • @FranciscoGómez 确保你谷歌如何更改sys.path*.pth文件,因为以import sys; sys.path.append('/usr/lib/python3/...'开头的每个程序都是愚蠢的,而且浪费。
【解决方案2】:

试试:

python3.5 -m pip install setuptools

【讨论】:

  • 没有。我忘了提,pip 也不是问题; setuptools 已经安装好了,比如pygamedjango...问题是我不能在Python3中使用这个模块,它们只响应Python 2.7。
  • 如果您使用 pip,那么它们可能是为 python2.7 安装的,在 python3 中安装模块有助于确保它们实际上是为您选择的 python 版本安装的。请试一试我的回答。
猜你喜欢
  • 2013-06-29
  • 2014-07-05
  • 1970-01-01
  • 1970-01-01
  • 2017-06-09
  • 1970-01-01
  • 2013-03-27
  • 1970-01-01
  • 2019-06-02
相关资源
最近更新 更多