安装Anaconda后,每创建一个新的环境,是否会生成独立的PYTHONPATH变量?

62
我开始使用来自Continuum.io的Python Anaconda发行版进行scipy工作。我已经成功运行了Anaconda,但是我不确定Anaconda是否为每个新环境创建一个新的PYTHONPATH环境变量,还是依赖于常见的系统PYTHONPATH。在文档中没有找到任何相关信息。
此外,当我执行printenv时,在新创建的环境中看不到PYTHONPATH变量,但我找到了一些新的由anaconda创建的环境变量。
最好的方法是Anaconda将一些Anaconda目录和新环境目录添加到PATH变量的开头,但这并不一定将新包与系统环境隔离开来,但它很接近。
有没有人知道这个问题的答案或者找到了解决这个问题的方法?

1
但并非所有的Python软件包都在Anaconda中提供,那么如果您也使用pip安装软件包,这是很常见的情况,该怎么办呢?然后您确实需要一个(特定于Python版本的)PYTHONPATH,因此您需要担心在每个shell /每次源激活脚本更改Python版本时更改/设置它。对吧? - smci
2个回答

42

Anaconda不使用PYTHONPATH。但需要注意的是,如果设置了PYTHONPATH,它可能会被用于加载不在Anaconda环境中的库。因此,在激活环境之前最好执行以下操作:

unset PYTHONPATH

例如,这个PYTHONPATH指向一个不正确的pandas库:

export PYTHONPATH=/home/john/share/usr/anaconda/lib/python
source activate anaconda-2.7
python
>>>> import pandas as pd
/home/john/share/usr/lib/python/pandas-0.12.0-py2.7-linux-x86_64.egg/pandas/hashtable.so: undefined symbol: PyUnicodeUCS2_DecodeUTF8
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/john/share/usr/lib/python/pandas-0.12.0-py2.7-linux-x86_64.egg/pandas/__init__.py", line 6, in <module>
    from . import hashtable, tslib, lib
ImportError: /home/john/share/usr/lib/python/pandas-0.12.0-py2.7-linux-x86_64.egg/pandas/hashtable.so: undefined symbol: PyUnicodeUCS2_DecodeUTF8

取消设置 PYTHONPATH 可以防止错误的 pandas 库被加载:

unset PYTHONPATH
source activate anaconda-2.7
python
>>>> import pandas as pd
>>>>

9
使用PYTHONPATH指向本地生成的文件和模块安全吗?是否有比使用PYTHONPATH更好的方法? - garyp
4
我猜对于开发人员来说这很好用。我倾向于从包含我正在工作的模块的目录中运行Python,这基本上是相同的。您还可以使用pip install -e python_module_dir命令并加载Anaconda环境,以便不需要更新PYTHONPATH - inodb

39

不,修改Anaconda环境需要的唯一内容是PATH(以便从环境bin/目录或Windows上的Scripts\获取正确的Python)。

Anaconda环境的工作方式是将安装的所有内容硬链接到环境中。就所有方面而言,这意味着每个环境都是Python和所有软件包的完全独立的安装。通过使用硬链接,可以高效地完成此操作。因此,无需处理PYTHONPATH,因为环境中的Python二进制文件已经搜索环境中的site-packages和lib等目录。


1
在Windows机器上使用它,两个安装的PYTHONPATH肯定不同。Anaconda没有我的模块目录。为了参考,我从Windows 7的高级系统设置中添加了它。从Python看起来很好,但在IPython笔记本中却出现了问题。 - Joop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接