linux下的source命令 | 您所在的位置:网站首页 › linux里source执行不了 › linux下的source命令 |
背景:在一个项目中,需要在shell脚本文件中激活虚拟环境,然后在指定的虚拟环境中执行python脚本。遇到了各种坑,主要有:conda命令找不到、conda activate命令找不到、Docker相关问题。文本主要记录source命令含义,以及解决在脚本中激活虚拟环境的问题。 source命令 语法:source filename [arguments]返回值:退出状态码参数:传递给filename的参数功能:source是bash shell的内置命令,用于读取filename脚本文件中的命令,并在当前shell执行。由于filename的执行环境是在当前shell,因此常用source命令在配置文件改变后,重新执行配置文件,避免重新登录。 source filename 与sh filename的区别sh 会新建一个子shell,并在子shell中读取执行filename中的命令。子shell会继承父shell的环境变量,但子shell中新生成的变量或者环境变化并不会传播到父shell中,如需将新变量导入到父shell中,需使用export命令。 source activate激活虚拟环境报错当使用source activate env_name时,提示“bash: activate: No such file or directory”错误,表示bash在环境变量中找不到activate命令,此时需要设置conda路径到环境变量。解决方案: export PATH="~/miniconda3/bin:$PATH" source activate 与conda activate的区别重要的一点: source activate 可以在shell脚本开头处激活虚拟环境,而用conda activate则提示“CommandNotFoundError: Your shell has not been properly configured to use ‘conda activate’.”错误。这点很重要,因为经常需要在脚本中先激活特定的环境,然后在特定环境中执行python脚本。观察下列实例,假设test.sh的代码如下: #! /bin/bash source activate python3.6
命令 sh -c "conda activate python3.6" 相当于在shell脚本开始处,激活环境,但出现conda activate NotFoundError,该问题的解决办法见后面。 命令source test2.sh不会报错,并且在当前shell中成功激活python3.6虚拟环境。 在网上还发现两者的另外一个区别:“从conda 4.4.0起,conda activate和conda deactivate是激活和退出环境的首选命令。它们比以前conda版本的source activate和source deactivate命令要灵活得多。conda activate命令还具有以下优点:(1)在所有操作系统,shell和平台上都是通用的,以及(2)没有与其他软件包(如python virtualenv的激活脚本)的脚本发生路径冲突。” source 与source activate的区别这是个简单但容易混淆的点,本质上source命令还是上面提到的bash的内置source命令,而activate本质是在 ~/miniconda3/bin目录下的一个可执行文件(同理deactivate也是位于同一位置的可执行文件)。activate后接的虚拟环境名称将作为参数输入到activate可执行文件中执行,源码如下所示:
当在shell脚本中用conda activate激活虚拟环境时,会包如下错误: |
CopyRight 2018-2019 实验室设备网 版权所有 |