在Windows上使用Cygwin和Anaconda环境

23

试图通过Windows NT上的cygwin接口使用anaconda设置环境,但失败了。

创建环境(conda create -n test_env)没有问题。但activate test_env失败了。

我尝试使用以下方法进行调整:

export PATH=/cygdrive/c/users/nick/anaconda3/envs/test:$PATH

这修复了某些行为(which python 指向正确的 Python)。但如果我执行“conda install”命令,它会安装到根 anaconda 目录而不是环境中。也许 export 是局部的 bash 会话,并且 conda 调用了不同版本的 PATH?有没有办法使 PATH 的修改全局化?

5个回答

27

在苦思冥想了相当长时间之后,我认为我已经找到了一个合理且可行的方法,将Anaconda的Python(及其相关环境)集成到Cygwin中。 假设您已经独立使用Cygwin和Anaconda,以下设置在.bash_profile中似乎能够解决所有问题。(我仅包含与集成相关的.bash_profile部分...希望我没有不小心漏掉什么。)

这个设置基本上可以做三件事情。 首先,用户需要明确设置目录$CONDA_BASE_DIR,该目录是conda/anaconda/miniconda的基本环境安装位置。 其次,在.bash_profile中有一种功能,可以使用shell变量$CONDA_DEFAULT_ENV跟踪当前conda环境。 最后,我们定义了一个别名cyg-conda和一个函数cyg-activate,用作标准condaactivate命令的替代命令。请注意,变量名$CONDA_DEFAULT_ENV是特殊的,并且被实际的conda命令在内部使用。

使用此设置,我能够以与在Anaconda命令提示符下通常使用condaactivate相同的方式使用cyg-condacyg-activate,同时使环境可用于我的Cygwin bash shell。

当然,欢迎提出改进意见等。

###############################################################################

#  Anaconda Environment Selection - Plese set CONDA_BASE_DIR to the directory
#  containing the base installation of anaconda/miniconda.

export CONDA_BASE_DIR=/cygdrive/c/Users/Patrick/Miniconda3

#  Proxy Servers & Network Setup (if needed)

export HTTP_PROXY=
export HTTPS_PROXY=

#  IMPORTANT - Ignore carriage returns when using a Cygwin environment.

export SHELLOPTS
set -o igncr

###############################################################################

#  Manage conda environments for Python.  We check the environment variable
#  $CONDA_DEFAULT_ENV to see which environment is desired.  The default (root)
#  environment will be chosen if nothing is specified.  Note that this variable
#  will be explicitly managed by the cyg-activate ( ) function we have defined
#  below, specifically for the purpose of changing environments.  The root
#  environment is also handled slightly different from the others when it comes
#  to setting the CONDA_DEFAULT_ENV variable.

if [ ${CONDA_DEFAULT_ENV} ] && [ ${CONDA_DEFAULT_ENV} != 'root' ] 
then
    #  SELECT ONE OF THE NON-DEFAULT ENVIRONMENTS
    export CONDA_PREFIX=${CONDA_BASE_DIR}/envs/${CONDA_DEFAULT_ENV}
else
    #  SELECT THE DEFAULT ENVIRONMENT (and set CONDA_DEFAULT_ENV full path)
    export CONDA_DEFAULT_ENV=root
    export CONDA_PREFIX=${CONDA_BASE_DIR}
fi

###############################################################################

#  Define cyg-conda and cyg-activate to facilitate management of conda.

alias cyg-conda=${CONDA_BASE_DIR}/Scripts/conda.exe

cyg-activate() {
    export CONDA_DEFAULT_ENV=$1
    source ~/.bash_profile
    cyg-conda info --envs
}

###############################################################################

#  PATH - ALl of the anaconda/miniconda path entries appear first.

PATH=
PATH=$PATH:$CONDA_PREFIX
PATH=$PATH:$CONDA_PREFIX/Library/mingw-w64/bin
PATH=$PATH:$CONDA_PREFIX/Library/usr/bin
PATH=$PATH:$CONDA_PREFIX/Library/bin
PATH=$PATH:$CONDA_PREFIX/Scripts
PATH=$PATH:$HOME/scripts
PATH=$PATH:$HOME/local/bin
PATH=$PATH:/usr/local/bin
PATH=$PATH:/usr/bin

export PATH

###############################################################################

如果我正在运行ZSH,是否需要使用set -o igncr命令? - Luke
这个集成需要记住的一些事情。 (i) 请直接从安装程序安装Anaconda,而不是像Chocolatey这样的包管理器,因为对于这种方法来说,envs必须在anaconda根目录内。(ii) 为了使anaconda python在cygwin命令行中工作,您必须使用python -i。只使用python会冻结屏幕。 - rambalachandran
为了更清晰地说明,您需要source此脚本(手动或在.bashrc中),然后运行cyg-activate,最后source激活您的env。 - FHTMitchell
这非常有帮助并且有效。为了使事情更加顺利,我还添加了以下功能来覆盖conda命令并使事情更加顺利运行。功能链接 - Zaya

12

conda 4.4版本开始,activate和deactivate命令在cygwin下支持以下语法(链接的文档还提供了将conda添加到PATH的最佳实践,值得一看):

conda activate <name-of-environment-to-activate>
conda deactivate

然而,有一个错误导致这些功能无法开箱即用,问题在于cygwin使用的所有bash脚本都具有Windows换行符(CRLF)。要解决此问题,有几个选项:

  1. 将以下内容添加到您的.bash_profile.bashrc中(如@patrickkelly的答案中所示):

    if [[ "${OSTYPE}" == 'cygwin' ]]; then
        set -o igncr
        export SHELLOPTS
    fi
    
  2. 使用类似于dos2unix的工具将相关文件的行尾转换为Unix格式(LF)。下面的文件必须转换,位于安装conda的目录中,可能还有其他文件:

    • etc/profile.d/conda.sh
    • Scripts/activate
    • Scripts/deactivate


    更新:当conda自我更新时,这些文件至少有一部分时间会被覆盖,恢复CRLF行尾,因此在这种情况下需要重新执行将它们转换为LF的过程。


这个答案的第一项解决了我所有的Anaconda/Cygwin问题。看起来有很多脚本都是以dos行结尾的。即使我执行了“conda init bash”,我的.bash_profile在添加了“eval”命令后也会自动转换为dos结尾,这破坏了bash的启动。另请参见https://dev59.com/H2Uq5IYBdhLWcg3wT-2D#14607651。 - chiefenne
这对我来说在最近的Miniconda(4.7.10)上运行良好。 以前我遇到了一些Cygwin的问题,但令人惊讶的是,只需设置“igncr”似乎就可以解决所有问题。 我认为自上次尝试以来修复了一些其他小bug。 - Iguananaut
当使用建议#1时,conda activate不会激活环境,但是source activate会。 - Aditya Kendre
运行 conda init bash 后,我还需要将 C:\Users\<username>\.bash_profile 的内容复制到 cygwin 主目录 C:\cygwin64\home\<username>。显然它使用的是 Windows %USERPROFILE% 目录,而不是 bash $HOME - goweon

3

因为Cygwin模拟了Linux环境,所以我们需要使用“source activate test_env”而不是“activate test_env”。


1
不幸的是,它会抛出自己的错误。从Anaconda论坛上看,答案似乎是“等待4.1版本或使用开发版本”——那里已经修复了。 :) - nick_eu
具体来说,我得到了“bash:/usr/bin/conda:没有那个文件或目录”的错误提示。 - nick_eu

2
这个问题的答案一般都是基于2016年。但是到了2022年,情况已经不同了。我在$HOME/bin目录下有一个脚本,我称之为conda_stuff,通过. conda_stuff 来调用它(我没有将其放在.bashrc中,因为这会拖慢终端窗口的启动速度)。
其中anaconda安装在C:\Users\john\anaconda3目录下:
# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
eval "$('/cygdrive/c/Users/john/anaconda3/Scripts/conda.exe' 'shell.bash' 'hook')"
# <<< conda initialize <<<

从这里开始,我们只需要执行例如:
conda create -y --name py39a python=3.9
conda activate py39a # we're using this environment mainly

谢谢。这对我来说(大多数情况下 - 自动完成通常不起作用)是有效的。任何试图做这个的人可能已经知道了,但以防万一(也许有些人像我一样通常在Linux Windows中工作,可能会忘记这一点) - 由conda.exe返回的脚本包含回车符(/r)。因此,您需要确保已将Cygwin设置为忽略它们,或者使用“eval”内部的类似'sed'的过滤器将其过滤掉。 - notMyScreenName

1

在激活conda和cygwin的环境下,一种工作方式是:

  • 打开cmd:Win+R并输入cmd
  • 激活conda:conda activate env
  • 打开cygwin:cygwin(必须将cygwin添加到PATH中)

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