无法将PIL导入Python Shell,但可以导入终端

时间:2016-01-13 07:52:12

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

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

终端输出:

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终端中导入Python Imaging Library(PIL),但不能在Python Shell中导入,以及如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

你永远不应该使用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 ->表示名称pip链接到箭头后面的文件。您可以看到这些名称​​指向的位置,以及pip正在将模块安装到哪个python中。

===

你安装了Anaconda,Anaconda劫持名称pythonpip供自己使用,所以你会看到这样的东西:

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

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

Anaconda没有劫持名称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目录以查找命令pythonpip以及idlepython命令位于该目录中:

~$ 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。 )

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

$ 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变量的其他目录中继续搜索空闲。如果您想要启动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.
>>> 

编辑:过了一段时间后,我发现openssl也可以在Anaconda的目录中找到,所以当我不在.bash_profile时,我已经回过头来评论该行使用Anaconda - Anaconda只是劫持了太多名字。