【问题标题】:Cannot import PIL into Python Shell, but can into Terminal无法将 PIL 导入 Python Shell,但可以导入终端
【发布时间】:2016-01-13 07:52:12
【问题描述】:

我已经在终端中使用sudo pip install Pillow 在可能的 Macintosh 上安装了 Pillow。我知道它已安装,因为每当我在终端窗口中输入python 后运行import PIL,这就是我的输出:

终端输出:

Python 3.5.1 |Anaconda 2.4.1 (x86_64)| (default, Dec  7 2015, 11:24:55) 
[GCC 4.2.1 (Apple Inc. build 5577)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import PIL
>>> 

然而,奇怪的是,在 Python Shell 中,当我做同样的事情时,我得到了这个:

Python Shell (IDLE) 输出:

Python 3.5.1 (v3.5.1:37a07cee5969, Dec  5 2015, 21:12:44) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "copyright", "credits" or "license()" for more information.
>>> import PIL
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    import PIL
ImportError: No module named 'PIL'

为什么我可以在 Macintosh Terminal 中导入 Python Imaging Library (PIL),但不能在 Python Shell 中,我该如何解决这个问题?

【问题讨论】:

  • 具有不同系统路径的不同 Python 安装 - 尝试import sys; print(sys.path)

标签: shell python-3.x python-imaging-library anaconda python-idle


【解决方案1】:

您永远不应该使用 sudo 来安装 python 模块。

当您安装了多个版本的 python 时,每个版本都有自己的名称、自己的 pip 和自己的 IDLE。您在命令行上发出的命令决定了将启动哪个 python。您安装的其中一个 python 版本将链接到名称python,而其他版本的名称将包含该版本,例如python3.5.

为了弄清楚你正在启动哪个版本的 python,你可以用它的版本名称 python3.5 启动 python,用它​​的版本名称 pip3.5 执行 pip,然后用它的版本名称 idle3.5 启动 IDLE。

这里有一些命令可以帮助您找出pip install Pillow 在哪里安装模块:

~$ which pip
/usr/local/bin/pip

~$ cd /usr/local/bin

/usr/local/bin$ ls -al pip*
    lrwxrwxr-x  1 root  admin  65 Apr 10  2015 pip ->
 ../../../Library/Frameworks/Python.framework/Versions/2.7/bin/pip
    lrwxrwxr-x  1 root  admin  66 Apr 10  2015 pip2 ->
 ../../../Library/Frameworks/Python.framework/Versions/2.7/bin/pip2
    lrwxrwxr-x  1 root  admin  68 Apr 10  2015 pip2.7 ->
 ../../../Library/Frameworks/Python.framework/Versions/2.7/bin/pip2.7
    lrwxrwxr-x  1 root  admin  66 Apr  7  2015 pip3 ->
 ../../../Library/Frameworks/Python.framework/Versions/3.4/bin/pip3
    lrwxrwxr-x  1 root  admin  68 Apr  7  2015 pip3.4 ->
 ../../../Library/Frameworks/Python.framework/Versions/3.4/bin/pip3.4

语法pip -&gt;表示名称pip链接到箭头后面的文件。您可以看到这些名称​​指向的位置,以及 pip 正在将模块安装到哪个 python 中。

===

您安装了 Anaconda,而 Anaconda 劫持了名称 pythonpip 供自己使用,因此您会看到如下内容:

~$ which python
/Users/7stud/anaconda/bin/python

~$ which pip
/Users/7stud/anaconda/bin/pip

Anaconda 不会劫持名称 idle,因此 idle 指向另一个 python 安装:

~$ which idle
/usr/local/bin/idle

~$ cd /usr/local/bin

/usr/local/bin$ ls -al idle*
    lrwxr-xr-x  1 root  wheel  66 Apr 10  2015 idle ->
 ../../../Library/Frameworks/Python.framework/Versions/2.7/bin/idle
    lrwxr-xr-x  1 root  wheel  67 Apr 10  2015 idle2 ->
 ../../../Library/Frameworks/Python.framework/Versions/2.7/bin/idle2
    lrwxr-xr-x  1 root  wheel  69 Apr 10  2015 idle2.7 ->
 ../../../Library/Frameworks/Python.framework/Versions/2.7/bin/idle2.7
    lrwxr-xr-x  1 root  wheel  67 Apr  7  2015 idle3 -> 
../../../Library/Frameworks/Python.framework/Versions/3.4/bin/idle3
    lrwxr-xr-x  1 root  wheel  69 Apr  7  2015 idle3.4 -> 
../../../Library/Frameworks/Python.framework/Versions/3.4/bin/idle3.4

Anaconda 通过在文件 ~/.bash_profile 的末尾添加以下行来劫持名称 python 和 pip:

export PATH="/Users/7stud/anaconda/bin:$PATH"

当您在命令行上发出命令时,终端窗口会在您的 PATH 环境变量中指定的目录中搜索该命令——按顺序。因为 Anaconda 路径位于 PATH 变量的前面,所以首先在 Anaconda 目录中搜索命令 pythonpipidle。在该目录中可以找到python 命令:

~$ which python
/Users/7stud/anaconda/bin/python

~$ cd /Users/7stud/anaconda/bin/

~/anaconda/bin$ ls -al python*
lrwxr-xr-x  1 7stud  staff     9 Dec 22 05:29 python -> python3.5
-rwxrwxr-x  1 7stud  staff   272 Dec 22 05:29 python-argcomplete-check-easy-install-script
-rwxrwxr-x  1 7stud  staff   129 Dec 22 05:29 python.app
lrwxr-xr-x  1 7stud  staff     9 Dec 22 05:29 python3 -> python3.5
lrwxr-xr-x  1 7stud  staff    17 Dec 22 05:29 python3-config -> python3.5m-config
-rwxrwxr-x  1 7stud  staff  9096 Dec  7 10:27 python3.5 

(除了名称python,还可以看到名称python3和python3.5。因为python和python3都指向python3.5,所以命令python、python3和python3.5都执行同一个python。 )

pip 命令也可以在 Anaconda 目录中找到:

$ which pip
/Users/7stud/anaconda/bin/pip

$ cd /Users/7stud/anaconda/bin

~/anaconda/bin$ ls -al pip*
-rwxrwxr-x  1 7stud  staff  125 Dec 22 05:29 pip

pip 只有一个名字。

但是,在 Anaconda 目录中找不到idle 命令:

~$ which idle
 /usr/local/bin/idle

双重检查:

~$ cd ~/anaconda/bin

~/anaconda/bin$ ls -al idle*
lrwxr-xr-x  1 7stud  staff    7 Dec 22 05:29 idle3 -> idle3.5
-rwxrwxr-x  1 7stud  staff  108 Dec 22 05:29 idle3.5

名称idleidle3idle3.5 不同,因此在PATH 变量的其他目录中继续搜索idle。如果要启动 Anaconda 空闲,可以使用名称 idle3idle3.5

因为我讨厌 Anaconda 劫持所有这些 python 名称的方式,这使我无法使用这些名称来运行我的其他 python 版本,所以当我不使用 Anaconda 时,我在 ~/.bash_profile 中注释掉以下行:

# export PATH="/Users/7stud/anaconda/bin:$PATH"

要使您在~./bash_profile 中所做的更改生效,您需要关闭终端窗口并启动一个新窗口,或者发出以下命令:

$ source ~/.bash_profile

防止 Anaconda 劫持所有这些 python 名称的另一种方法是执行以下操作:

~/anaconda/bin$ mv python xpython  #change the name to xpython
~/anaconda/bin$ mv python3 xpython3 
~/anaconda/bin$ cp python3.5 pyana  #copy to a new name
~/anaconda/bin$ mv python3.5 xpython3.5

这会以假名保留所有原始名称(如果出现问题,您可以将 x 名称更改回原始名称),它还会为您的 Anaconda python 创建名称 pyana。现在,python、python3 等名称仍将指向它们在安装 Anaconda 之前使用的相同 python 版本:

~/anaconda/bin$ which python
/usr/local/bin/python

~/anaconda/bin$ which python3
/usr/local/bin/python3

~/anaconda/bin$ which pyana
/Users/7stud/anaconda/bin/pyana

~/anaconda/bin$ pyana --version
Python 3.5.1 :: Anaconda 2.4.1 (x86_64)

~/anaconda/bin$ pyana
Python 3.5.1 |Anaconda 2.4.1 (x86_64)| (default, Dec  7 2015, 11:24:55) 
[GCC 4.2.1 (Apple Inc. build 5577)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 

编辑:一段时间后,我发现在 Anaconda 的目录中也找到了 openssl,所以当我不使用 Anaconda 时,我又回去注释掉 .bash_profile 中的行——Anaconda 只是劫持了太多名称.

【讨论】:

  • 是的,这两个 Python 都是 3.5.1,你可以在我的帖子中看到
  • 同样在命令行中,我刚刚输入了python,它显然启动了我想要的那个
  • 我修好了。只需在终端中执行pip3.5 install Pillow 即可,一切都已解决!不过还是谢谢!
  • @R。 Kap,如果您想更好地解释您所看到的内容,请阅读我添加的其他内容。
  • 哇,这真的很有帮助!谢谢! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
  • 2018-09-17
  • 1970-01-01
  • 2019-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多