在Cygwin中永久设置Anaconda的Python路径

28 投票
8 回答
41465 浏览
提问于 2025-04-18 10:01

我正在尝试在我的Windows 7电脑上安装Anaconda。我经常使用cygwin来进行命令行操作,希望能从那里管理Anaconda。我顺利地完成了图形安装程序,并勾选了必要的选项,以将默认的Python路径重置为这个安装的Python。接下来,我检查了一下Python的位置,最开始我得到了这个...

$ which python
/usr/bin/python

从这里开始,Python运行得很好...

$ python
Python 2.7.5 (default, Oct  2 2013, 22:34:09)
[GCC 4.8.1] on cygwin
Type "help", "copyright", "credits" or "license" for more information.

但是我想使用Anaconda,所以我需要重新定义我的路径...

$ export PATH=/cygdrive/c/anaconda:$PATH
$ which python
/cygdrive/c/anaconda/python

现在我应该可以正常使用了,但当我尝试进入Python时,它就卡住了。

$ python

你知道这可能是什么原因吗?下面是详细的返回信息...

$ python -v
# installing zipimport hook
import zipimport # builtin
# installed zipimport hook
# C:\anaconda\lib\site.pyc matches C:\anaconda\lib\site.py
import site # precompiled from C:\anaconda\lib\site.pyc
# C:\anaconda\lib\os.pyc matches C:\anaconda\lib\os.py
import os # precompiled from C:\anaconda\lib\os.pyc
import errno # builtin
import nt # builtin
# C:\anaconda\lib\ntpath.pyc matches C:\anaconda\lib\ntpath.py
import ntpath # precompiled from C:\anaconda\lib\ntpath.pyc
# C:\anaconda\lib\stat.pyc matches C:\anaconda\lib\stat.py
import stat # precompiled from C:\anaconda\lib\stat.pyc
# C:\anaconda\lib\genericpath.pyc matches C:\anaconda\lib\genericpath.py
import genericpath # precompiled from C:\anaconda\lib\genericpath.pyc
# C:\anaconda\lib\warnings.pyc matches C:\anaconda\lib\warnings.py
import warnings # precompiled from C:\anaconda\lib\warnings.pyc
# C:\anaconda\lib\linecache.pyc matches C:\anaconda\lib\linecache.py
import linecache # precompiled from C:\anaconda\lib\linecache.pyc
# C:\anaconda\lib\types.pyc matches C:\anaconda\lib\types.py
import types # precompiled from C:\anaconda\lib\types.pyc
# C:\anaconda\lib\UserDict.pyc matches C:\anaconda\lib\UserDict.py
import UserDict # precompiled from C:\anaconda\lib\UserDict.pyc
# C:\anaconda\lib\_abcoll.pyc matches C:\anaconda\lib\_abcoll.py
import _abcoll # precompiled from C:\anaconda\lib\_abcoll.pyc
# C:\anaconda\lib\abc.pyc matches C:\anaconda\lib\abc.py
import abc # precompiled from C:\anaconda\lib\abc.pyc
# C:\anaconda\lib\_weakrefset.pyc matches C:\anaconda\lib\_weakrefset.py
import _weakrefset # precompiled from C:\anaconda\lib\_weakrefset.pyc
import _weakref # builtin
# C:\anaconda\lib\copy_reg.pyc matches C:\anaconda\lib\copy_reg.py
import copy_reg # precompiled from C:\anaconda\lib\copy_reg.pyc
# C:\anaconda\lib\traceback.pyc matches C:\anaconda\lib\traceback.py
import traceback # precompiled from C:\anaconda\lib\traceback.pyc
# C:\anaconda\lib\sysconfig.pyc matches C:\anaconda\lib\sysconfig.py
import sysconfig # precompiled from C:\anaconda\lib\sysconfig.pyc
# C:\anaconda\lib\re.pyc matches C:\anaconda\lib\re.py
import re # precompiled from C:\anaconda\lib\re.pyc
# C:\anaconda\lib\sre_compile.pyc matches C:\anaconda\lib\sre_compile.py
import sre_compile # precompiled from C:\anaconda\lib\sre_compile.pyc
import _sre # builtin
# C:\anaconda\lib\sre_parse.pyc matches C:\anaconda\lib\sre_parse.py
import sre_parse # precompiled from C:\anaconda\lib\sre_parse.pyc
# C:\anaconda\lib\sre_constants.pyc matches C:\anaconda\lib\sre_constants.py
import sre_constants # precompiled from C:\anaconda\lib\sre_constants.pyc
# C:\anaconda\lib\locale.pyc matches C:\anaconda\lib\locale.py
import locale # precompiled from C:\anaconda\lib\locale.pyc
import encodings # directory C:\anaconda\lib\encodings
# C:\anaconda\lib\encodings\__init__.pyc matches C:\anaconda\lib\encodings\__init__.py
import encodings # precompiled from C:\anaconda\lib\encodings\__init__.pyc
# C:\anaconda\lib\codecs.pyc matches C:\anaconda\lib\codecs.py
import codecs # precompiled from C:\anaconda\lib\codecs.pyc
import _codecs # builtin
# C:\anaconda\lib\encodings\aliases.pyc matches C:\anaconda\lib\encodings\aliases.py
import encodings.aliases # precompiled from C:\anaconda\lib\encodings\aliases.pyc
import operator # builtin
# C:\anaconda\lib\functools.pyc matches C:\anaconda\lib\functools.py
import functools # precompiled from C:\anaconda\lib\functools.pyc
import _functools # builtin
import _locale # builtin
# C:\anaconda\lib\encodings\cp1252.pyc matches C:\anaconda\lib\encodings\cp1252.py
import encodings.cp1252 # precompiled from C:\anaconda\lib\encodings\cp1252.pyc
# zipimport: found 13 names in C:\anaconda\lib\site-packages\runipy-0.1.0-py2.7.egg
# zipimport: found 144 names in C:\anaconda\lib\site-packages\setuptools-3.6-py2.7.egg
Python 2.7.7 |Anaconda 2.0.1 (64-bit)| (default, Jun 11 2014, 10:40:02) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
Anaconda is brought to you by Continuum Analytics.
Please check out: http://continuum.io/thanks and htt

我还有另一个(可能相关)的问题,就是每次关闭/打开cygwin时都需要重置路径。我在.bashrc和.profile中输入了以下内容,试图永久设置路径:

# Set path to python from anaconda install
export PATH=/cygdrive/c/anaconda:$PATH

但每次打开和关闭cygwin后,我又回到了:

$ which python
/usr/bin/python

这可能和设置某些系统环境变量有关吗?

8 个回答

1

关于如何永久设置你的路径,可以编辑你家目录下的 .profile 文件(这是一个隐藏文件)。

.profile 文件(还有其他名字也可以,具体可以查看 bash 的手册)里面包含了 bash 命令。当 bash 作为登录 shell 启动时,它会执行这个文件。

在这个文件的底部,添加你的设置路径的命令:

export PATH=/cygdrive/c/anaconda:$PATH

至于为什么 python 会卡住,请提供更多信息,比如执行 python -v 后的输出是什么?

3

还有一个关于conda和cygwin之间的问题。当你激活一个环境时,它会在你的路径前面加上一些目录,比如:

/C/Users/Thomas.Harris/AppData/Local/Continuum/Anaconda3/envs/blah
/C/Users/Thomas.Harris/AppData/Local/Continuum/Anaconda3/envs/blah/Library/mingw-w64/bin
/C/Users/Thomas.Harris/AppData/Local/Continuum/Anaconda3/envs/blah/Library/usr/bin
/C/Users/Thomas.Harris/AppData/Local/Continuum/Anaconda3/envs/blah/Library/bin
/C/Users/Thomas.Harris/AppData/Local/Continuum/Anaconda3/envs/blah/Scripts

但是,这些在cygwin中并不是有效的目录。

我通过以下方式解决了这个问题:

ln -s /cygdrive/c /C

然后,如果你用特定版本的python创建conda环境,它们应该就能正常工作了。

3

路径问题

关于你的路径问题,可以参考这个链接:在Windows上安装Anaconda,里面有解决方法。或者,你可以直接运行 /cygdrive/c/Anaconda/python.exe 来启动Anaconda的Python,这样就可以把标准的 python 保持指向Cygwin版本。

需要注意的是,网上的一些建议也提到了要修改 PYTHONPATH:如果你使用Anaconda的Python,你也需要Anaconda的Python库。如果你把不同的库混在一起,比如 numpy,可能会导致程序崩溃或者出错。检查的方法很简单,可以在Cygwin中安装一个你在Conda中不需要的模块,然后测试一下能否从Anaconda的Python中导入它。如果可以导入,说明你的路径设置有问题。

Anaconda的Python会自动把 c:\Anaconda 加入到你的PYTHONPATH中,但如果你设置的是Cygwin的Python库,那么这些库会在Anaconda的库之前被找到。试试这个:

import sys
sys.path

终端问题

不过,这也是一个终端的问题:Anaconda(Windows)的Python需要一个Windows的命令行,而现代的Cygwin命令行就像一个 xterm,差别很大。你可以通过运行 python --help 来诊断这个问题,如果这个命令能正常工作,但直接输入 python 时卡住了,那就是交互式提示的问题。这意味着你可以运行Python程序,只是无法与它们进行交互。

解决这个问题的方法是使用 cygwin bash shell,而不是 cygwin terminal(这两个都在开始菜单的Cygwin组里)。它们看起来很相似,但bash shell的字体不太好看,而且窗口宽度不能超过80个字符(就像其他CMD窗口一样,我一直不明白这个“特性”)。这是在CMD窗口中运行的Cygwin bash,你的Anaconda Python会是交互式的。而 cygwin terminal 则是在一个类似putty的环境中运行bash,这种环境模仿了xterm,Anaconda Python无法使用它。

5

我之前也遇到过在我的 Cygwin / Windows 7 系统上设置 Anaconda 的问题。最后我找到了解决办法,步骤如下:

  1. 编辑了 ~/.bashrc 文件。在文件的底部添加以下内容:

    export PATH=/cygdrive/c/Anaconda:$PATH

  2. 这样做的目的是把 Cygwin 的 Python 指向 Anaconda 的版本。你可以在 Cygwin 的控制台输入 which python 来验证这一点。不过,当我启动 Python 时,它会卡住,让我不得不按 ^C 退出命令。我发现输入 python -i 可以顺利启动交互式的 Python 解释器,没有问题。

29

在Cygwin中使用交互式Python命令行时,我会使用-i这个选项。

为了从Anaconda安装中获取它,我按照上面提到的步骤操作:

$ export PATH=/cygdrive/c/anaconda:$PATH
$ which python
/cygdrive/c/anaconda/python

然后我在Cygwin中用-i选项启动Python:

$ python -i
Python 2.7.8 |Anaconda 2.1.0 (64-bit)| (default, Jul  2 2014, 15:12:11) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
Anaconda is brought to you by Continuum Analytics.
Please check out: http://continuum.io/thanks and https://binstar.org
>>>>

这些库也都能正常工作。例如,pandas库(是通过Anaconda安装的)现在可以被导入了。

>>>> import pandas
>>>> pandas.DataFrame
<class 'pandas.core.frame.DataFrame'>

为了让这个设置永久生效,我在我的bashrc文件中添加了路径:

$ echo 'export PATH=/cygdrive/c/anaconda:$PATH' >> .bashrc
$ source .bashrc
$ which python
/cygdrive/c/anaconda/python

希望这对你有帮助。

撰写回答