Python-通过 shell 脚本激活 conda env

2025-04-01 09:56:00
admin
原创
8
摘要:问题描述:我希望运行一个简单的 shell 脚本来简化一些 conda 环境的管理。在 shell 中通过操作系统激活 conda 环境conda activate可以linux正常工作,但在 shell 脚本中会出现问题。有人能告诉我为什么会发生这种情况吗?重复该问题的示例:# default conda ...

问题描述:

我希望运行一个简单的 shell 脚本来简化一些 conda 环境的管理。在 shell 中通过操作系统激活 conda 环境conda activate可以linux正常工作,但在 shell 脚本中会出现问题。有人能告诉我为什么会发生这种情况吗?

重复该问题的示例:

# default conda env
$ conda info | egrep "conda version|active environment"
     active environment : base
          conda version : 4.6.9

# activate new env to prove that it works
$ conda activate scratch
$ conda info | egrep "conda version|active environment"
     active environment : scratch
          conda version : 4.6.9

# revert back to my original conda env
$ conda activate base 

$ cat shell_script.sh
#!/bin/bash
conda activate scratch

# run shell script - this will produce an error even though it succeeded above
$ ./shell_script.sh

CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'.
To initialize your shell, run

    $ conda init <SHELL_NAME>

Currently supported shells are:
  - bash
  - fish
  - tcsh
  - xonsh
  - zsh
  - powershell

See 'conda init --help' for more information and options.

IMPORTANT: You may need to close and restart your shell after running 'conda init'.

解决方案 1:

我使用'source 命令'来运行 shell 脚本,它起作用了:

source shell_script.sh

解决方案 2:

在 shell 脚本中使用conda activatesource activate并不总是有效,并且可能会引发类似这样的错误。一个简单的解决方法是将其放在脚本中的source ~/miniconda3/etc/profile.d/conda.sh任何命令之上:conda activate

source ~/miniconda3/etc/profile.d/conda.sh # Or path to where your conda is
conda activate some-conda-environment

这是对我有用的解决方案,如果共享脚本,它也会起作用。这也避免了必须使用的问题,conda init因为在我使用过的一些集群上,系统已初始化,但conda activate仍然无法在 shell 脚本中工作。

解决方案 3:

错误消息非常有用 - 它告诉您,conda 未在脚本运行的子 shell 中正确设置。为了能够在脚本中使用 conda,您需要(如错误消息所示)conda init bash先运行(或任何 shell)。conda 的行为及其设置方式取决于您的 conda 版本,但 4.4+ 版本行为的原因是它conda依赖于通常由 conda shell 本身设置的某些环境变量。最重要的是,此变更日志条目解释了为什么您的conda activatedeactivate命令在 4.4 及更高版本中不再按预期运行。

有关此内容的更多讨论,请参阅GitHub 上的官方 conda 问题。


编辑:进一步的研究告诉我,conda init错误消息中提到的功能实际上是 v4.6.0 的新功能,它允许快速设置环境,以便您可以使用它conda activate来代替旧的source activate。但是,它之所以有效,是因为它添加/更改了当前 shell 的几个环境变量,并且还更改了 RC 文件(例如.bashrc:),并且 RC 文件更改永远不会在当前 shell 中被拾取 - 仅在新创建的 shell 中被拾取。(当然,除非您再次获取 .bashrc)。事实上,conda init --help说了这么多:

重要提示:运行后conda init,大多数 shell 都需要关闭并重新启动才能使更改生效

但是,您显然已经运行了conda init,因为您可以交互使用conda activate。事实上,如果您打开 .bashrc,您应该能够看到 conda 添加的几行代码,告诉您的 shell 在哪里查找 conda 命令。但是,您的脚本的问题在于 .bashrc 不是运行 shell 脚本的子 shell 提供的(有关更多信息,请参阅此答案)。这意味着即使您的非登录交互式 shell 可以看到 conda 命令,您的非交互式脚本子 shell 也看不到 - 无论您调用 多少次conda init

这导致了一个猜想(我自己在 Linux 上没有 conda,所以我无法测试它),通过像这样运行你的脚本:

bash -i shell_script.sh

您应该看到conda activate它正常工作。为什么?-i是一个 bash 标志,它告诉 shell 您开始以交互模式运行,这意味着它将自动获取您的 .bashrc。这应该足以让您在脚本中使用 conda,就像您正常使用它一样。

解决方案 4:

快速解决方案bash:将以下初始化脚本添加到您的 Bash 脚本中。

eval "$(command conda 'shell.bash' 'hook' 2> /dev/null)"

完毕。


对于其他 shell,请检查你的 shell 的 init conf,复制 shell conf 中的以下内容并将其添加到你的脚本中。

# >>> conda initialize >>>
...
# <<< conda initialize <<<

您还可以使用

conda init --all --dry-run --verbose

获取脚本中所需的初始化脚本。

解释

这与4.6conda init中的引入有关。conda

引自 conda 4.6 发布日志

Conda 4.4 允许“conda activate envname”。问题是设置 shell 以使用此新功能并不总是那么简单。Conda 4.6 增加了广泛的初始化支持,因此比以往任何时候都有更多 shell 可以使用新的“conda activate”命令。有关更多信息,请阅读“conda init –help”的输出

conda init自 4.6引入后conda,conda 只将命令暴露
到“base”中的二进制conda文件中PATH,而不是所有二进制文件中。环境切换在所有平台上都通过conda activate env-name和统一。conda deactivate

但是为了使这些新命令起作用,您必须使用 进行额外的初始化conda init

问题在于你的脚本文件在子 shell 中运行,并且conda未在此子 shell 中初始化。

参考

  • Conda 4.6 发布

  • Unix shell 初始化

  • Shell 启动脚本

解决方案 5:

Github上的这个答案对我有用(我使用的是 Ubuntu,所以它不仅适用于 Windows):

eval "$(conda shell.bash hook)"
conda activate my_env

解决方案 6:

如果您想使用 shell 脚本在另一个 conda 环境中运行另一个 python 文件,只需通过以下命令运行另一个文件。

os.system('conda run -n <env_name> python <path_to_other_script>')

解决方案 7:

我发现上述脚本都没什么用。如果你想在非交互模式下运行 conda,这些脚本就很好,但我想在交互模式下运行它。如果我运行:

conda activate my_environment 

在 bash 脚本中它只在脚本中运行。

我发现在 .bashrc 中创建一个别名就可以将目录更改为我正在处理的特定项目,并为我设置正确的 conda 环境。所以我在 .bashrc 中包含:

alias my_environment="cd ~/subdirectory/my_project && conda activate my_environment"

进而:

source ~/.bashrc

然后我只需在命令行中输入:

my_environment

每次我想从事不同的项目时,都要切换到正确的项目和正确的环境。

解决方案 8:

在你的 shell 中简单地执行这样的操作有什么问题:

源 /opt/conda/etc/profile.d/conda.sh

(conda init 仍然标记为实验性的,因此不确定使用它是否是个好主意)。

解决方案 9:

尝试从 C++ 或 Python 文件激活 conda env 时,我也遇到了完全相同的错误。我通过绕过 conda activate 语句并使用特定 conda env 的绝对路径解决了这个问题。

对我来说,我使用 conda 设置了一个名为“testenv”的环境。

我使用以下方法搜索了所有 Python 环境

whereis python | grep 'miniconda'

它返回了一个 Python 环境列表。然后我使用以下命令运行 my_python_file.py。

~/miniconda3/envs/testenv/bin/python3.8 my_python_file.py

您也可以在 Windows 上执行同样的事情,但查找 python 和 conda python 环境有点不同。

解决方案 10:

我刚刚遵循了类似hong-xu的解决方案

因此,要运行一个使用参数调用脚本并使用特定 conda 环境的 shell 命令:

从 jupyter 单元来看,过程如下:

p1 = <some-value>
run = f"conda run -n {<env-name>} python {<script-name>.py} \n    --parameter_1={p1}"

!{run}

解决方案 11:

问题是,当您运行 bash 脚本时,会创建一个未正确初始化的新 (linux) shell 环境。如果您打算激活 conda 环境,然后通过脚本运行 python,则可以按照接受的解决方案中讨论的那样正确初始化创建的 shell 环境。

但是,如果您想在完成此脚本后让 conda 环境处于活动状态,那么这将行不通,因为 conda 环境在新 shell 上已经发生了变化,并且您在完成脚本后退出该 shell。 将其视为运行bash,然后conda activate...运行 ​​exit 退出该bash... 有关如何在 Linux 上的当前 shell 中执行脚本的更多详细信息?:

总结

  1. 将该行添加#!/bin/bash为脚本的第一行

  2. 输入命令source shell_script.sh. shell_script.sh

注意:.在 bash 中相当于source在 bash 中。

解决方案 12:

这个答案与@Lamma 的答案类似。这对我有用 ->

(1)我定义了几个变量;conda activate 函数、环境目录和环境

conda_activate=~/anaconda3/bin/activate
conda_envs_dir=~/anaconda3/envs
conda_env=<env name>

(2)我利用conda activate环境

source ${conda_activate} ${conda_envs_dir}/${conda_env}

(3)然后你就可以运行你的python脚本了

python <path to script.py>

这绕过了conda init要求。我的.bashrc已经初始化并且获取.bashrc文件对我来说不起作用。@Lamma 的答案对我有用,上面的代码也是如此。

解决方案 13:

   #open terminal or CMD as administrator

$ cd <path Anaconda3 install>Scripts

$ activate

$ cd .. 

$ conda activate scratch
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2059  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1456  
  PLM(产品生命周期管理)软件在汽车行业正发挥着日益重要的作用,它贯穿于汽车从概念设计到退役处理的整个生命周期,为汽车企业提升效率、降低成本、提高产品质量提供了强大的支持。通过实际应用案例的解析,能更直观地了解PLM软件在汽车行业的价值与影响。PLM软件助力汽车设计创新在汽车设计阶段,PLM软件为设计师提供了一个协同的...
plm项目管理系统   0  
  企业数字化转型已成为当今众多企业寻求突破与发展的关键战略。在这一进程中,产品生命周期管理(PLM)系统发挥着至关重要的作用。PLM系统涵盖了从产品概念设计到产品退役的全生命周期管理,通过整合数据、流程和人员,为企业数字化转型提供了强大的支持。它不仅能提升企业内部的协同效率,还能优化产品创新流程,增强企业对市场变化的响应...
plm软件   2  
  产品生命周期管理(PLM)系统旨在整合产品从概念设计到退役的全生命周期数据与流程,助力企业提升创新能力、缩短产品上市时间、降低成本。然而,在PLM系统实施过程中,企业往往会遭遇诸多挑战。这些挑战若得不到妥善解决,将严重影响系统的实施效果与企业的业务发展。接下来,我们深入探讨PLM系统实施过程中常见的三大挑战。业务流程与...
plm系统主要干什么的   0  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用