【问题标题】:Why does my batch script stop after activating a new conda env?为什么我的批处理脚本在激活新的 conda env 后停止?
【发布时间】:2017-03-09 10:48:40
【问题描述】:

这足以重现问题:

另存为test.bat

:: Create Conda env
set name=%1
conda create -n %name% python -y
activate %name%
echo "Never gets here"
:: script should continue below...

从 cmd 运行。

>test.bat "testname"

输出:

C:\Users\Jamie\git>test.bat testname

C:\Users\Jamie\git>set name=testname

C:\Users\Jamie\git>conda create -n testname python -y
Fetching package metadata ...........
Solving package specifications: .

Package plan for installation in environment C:\Users\Jamie\Miniconda2\envs\testname:

The following NEW packages will be INSTALLED:

    pip:            9.0.1-py27_1
    python:         2.7.13-0
    setuptools:     27.2.0-py27_1
    vs2008_runtime: 9.00.30729.5054-0
    wheel:          0.29.0-py27_0

#
# To activate this environment, use:
# > activate testname
#
# To deactivate this environment, use:
# > deactivate testname
#
# * for power-users using bash, you must source
#


C:\Users\Jamie\git>activate testname

(testname) C:\Users\Jamie\git>

就是这样。 echo 语句不执行,但没有错误信息。

为什么激活 conda env 会停止批处理脚本,有没有办法解决它?

【问题讨论】:

标签: batch-file conda miniconda


【解决方案1】:

使用

call activate %name%
  • 我假设activate 是一个批处理文件。如果您call 它,处理将在该批次完成后返回。如果没有call,执行将转移到activate,并在activate 结束时结束。

【讨论】:

  • 我需要在环境中才能继续
  • @JamieBull 对于 Conda,being in an environment 基本上设置了大约 4 个环境变量。如果您使用CALL,则激活批处理文件设置的环境变量将在返回时保留。见:paste.fedoraproject.org/paste/…
【解决方案2】:

正如提问者@Jamie Bull 本人在评论中所讨论的那样。

我需要在环境中才能继续

在我的情况下,更准确地描述它,我如何激活 CONDA ENV,直接一键或一键切换到工作目录?

从 Linux 的背景来看,我们更有可能通过一个简单的单行 BASH 脚本来完成这个请求。我在使用 BAT 文件时遇到了同样的问题,正如这里所讨论的,CMD 批处理文件的行为并不适合这项任务。在 BAT 中使用 CALL 指令也无济于事。

幸运的是,CONDA 现在已经打包了 PowerShell 的 PS1 启动脚本,相应的快捷方式让我有了另一个选择,经过几次测试,它可以工作了。

我的最终解决方案是为我的目的创建一个 Windows 快捷方式,即一键打开 PyTorch ENV 或 Tensorflow ENV。我刚刚制作了 CONDA 的包快捷方式的副本,对副本本身进行了编辑,然后编辑的快捷方式就可以使用了。截图会很好的解释。

对于 PS1 脚本,现在终于像 BASH 一样简单了:

# tf_env.ps1: Activate ENV and go to working directory
conda activate tf-gpu
cd C:\Tensorflow.Playground

【讨论】:

    【解决方案3】:

    尝试在 .bat 文件的末尾添加新行

    【讨论】:

    • 这实际上并不是结束,只是在示例中。我将进行编辑以明确说明
    • 啊,你说得对。想想看——它不可能继续执行——因为你已经开始了一个新的 shell 会话。与 ssh 相同。想象一下你做run-locally.shssh remote@serverrun-on-the-remote-server.sh远程命令永远不会执行,因为一旦登录它就会让你重新控制
    • 你不能使用activate(就像我想象的那样),但是你可以调用任何python二进制文件(你可以直接使用虚拟环境中的二进制文件)——不需要运行“activate”
    • 啊,是的。在我的脚本结束之前,我实际上不需要激活环境。谢谢,我想它现在已经排序了
    • 但如果有解决方案 - 它看起来像这样。 conda activate EVN_NAME --execute second_part_of_the_script.bat
    猜你喜欢
    • 1970-01-01
    • 2019-08-25
    • 2021-12-27
    • 1970-01-01
    • 2022-10-23
    • 2019-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多