【问题标题】:activate conda environment from batch file and stay activated? [duplicate]从批处理文件激活 conda 环境并保持激活状态? [复制]
【发布时间】:2020-05-08 03:02:21
【问题描述】:

我正在尝试在 *nix 系统上创建一个功能类似于 Makefile 的 make.bat 文件,作为 cookiecutter 项目模板的一部分。挑战在于找到一种能够激活 conda 环境并在将控制权传递回命令提示符时使该环境仍然处于活动状态的方法。

这是 make.bat 文件的样子。另外,如果你注意了,activatedeactivate 命令由于 Windows 环境的原因没有以sourceconda 为前缀。

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: VARIABLES                                                                    :
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

SETLOCAL
SET PROJECT_DIR=%cd%
SET PROJECT_NAME="00_test"
SET ENV_NAME=00_test
SET CONDA_PARENT=arcgispro-py3

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: COMMANDS                                                                     :
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

:: Jump to command
GOTO %1

:data
    CALL activate %ENV_NAME%
    CALL python src/data/make_dataset.py
    ECHO ">>> Data processed."
    EXIT /B

:: Export the current environment
:env_export
    CALL conda env export --name %ENV_NAME% > environment.yml
    ECHO ">>> %PROJECT_NAME% conda environment exported to ./environment.yml"
    EXIT /B

:: Build the local environment from the environment file
:env

    :: Run this from the ArcGIS Python Command Prompt
    :: Clone and activate the new environment
    CALL conda create --name %ENV_NAME% --clone %CONDA_PARENT%
    CALL activate %ENV_NAME%

    :: Install additional packages
    CALL conda env update -f environment.yml

    :: Additional steps for the map widget to work in Jupyter Lab
    CALL jupyter labextension install @jupyter-widgets/jupyterlab-manager -y
    CALL jupyter labextension install arcgis-map-ipywidget@1.7.0 -y

    EXIT /B

:: Activate the environment
:env_activate
    CALL activate %ENV_NAME%
    EXIT /B

EXIT /B

我只想简单地打字……

> make env_activate

...并让命令提示符激活环境,以便我可以继续使用项目 conda 环境工作。

正如您在屏幕截图中看到的那样,当环境被激活时,它不会在命令提示符处继续存在。

非常感谢您对此的任何帮助。这让我发疯了很长时间

【问题讨论】:

  • 我在你的图片中注意到(00_test) Z:\projects\00_test>EXIT /B 这似乎不寻常。我只能假设 CALL activate 00_test 返回 (00_test) 时只有一个换行符,(Unix 风格),而不是回车后跟一个换行符,(Windows 风格)。但是,我担心您发布的内容对我来说不清楚,因此我目前无法帮助您解决您的问题。我唯一的假设是您想要设置变量并在您使用EXIT 后让它们在环境中保持设置,这是正确的,如果是这样,请更好地解释一下。谢谢。
  • 我使用EXIT /B 作为退出脚本执行而不退出命令提示符窗口的一种方式。当我没有/B 时,窗口会在任何命令后关闭,这不是我想要的。
  • @Compo,activate 脚本在这种情况下通过在提示前加上 (00_test) 前缀来设置 prompt 变量,以通知用户虚拟环境处于活动状态。一旦prompt 变量稍后通过使用deactivate 脚本重置回默认值,这表明虚拟环境不再处于活动状态。如图所示,问题是环境更改在最后一行被重置,因为提示中不存在(00_test)

标签: python batch-file


【解决方案1】:
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: VARIABLES                                                                    :
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

SETLOCAL
SET "PROJECT_DIR=%cd%"
SET "PROJECT_NAME=00_test"
SET "ENV_NAME=00_test"
SET "CONDA_PARENT=arcgispro-py3"

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: COMMANDS                                                                     :
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

:: Jump to command
GOTO %1

:data
    ENDLOCAL & (
        CALL activate "%ENV_NAME%"
        CALL python src/data/make_dataset.py
        ECHO ^>^>^> Data processed.
    )
    EXIT /B

:: Export the current environment
:env_export
    ENDLOCAL & (
        CALL conda env export --name "%ENV_NAME%" > environment.yml
        ECHO ^>^>^> "%PROJECT_NAME%" conda environment exported to ./environment.yml
    )
    EXIT /B

:: Build the local environment from the environment file
:env
    ENDLOCAL & (

        REM Run this from the ArcGIS Python Command Prompt
        REM Clone and activate the new environment
        CALL conda create --name "%ENV_NAME%" --clone "%CONDA_PARENT%"
        CALL activate "%ENV_NAME%"

        REM Install additional packages
        CALL conda env update -f environment.yml

        REM Additional steps for the map widget to work in Jupyter Lab
        CALL jupyter labextension install @jupyter-widgets/jupyterlab-manager -y
        CALL jupyter labextension install arcgis-map-ipywidget@1.7.0 -y
    )
    EXIT /B

:: Activate the environment
:env_activate
    ENDLOCAL & CALL activate "%ENV_NAME%"
    EXIT /B

EXIT /B

问题在于调用的批处理文件脚本与环境 正在设置的变量,一旦主脚本以 隐式ENDLOCAL,将环境重置为使用前 的SETLOCALactivate 脚本需要在全局中调用 范围以在命令提示符下保持活动状态。

在使用CALL之前使用ENDLOCAL,但在同一块中 要执行的代码。 % 封闭的变量仍将被替换 即使ENDLOCAL 已被执行。这应该允许使用 如果SETLOCAL 不是,则调用的批处理文件脚本中的SET 是全局的 在那些脚本中使用。

我删除了一些使用 ECHO> 的双引号和 并与^ 一起逃脱成为^>

使用时使用双引号代替SET 时间。

未经测试,因为我没有安装 Anaconda 和 Jupyter。

【讨论】:

  • 非常感谢您对SETLOCALENDLOCAL 功能的清晰解释。这显然是我缺少的部分。您的编辑工作完美。另外,感谢您指出在 cmets 中转义字符的方法。虽然精通 Python,但批处理脚本对我来说还是有点陌生​​,所以我非常感谢您的耐心和解释。
猜你喜欢
  • 1970-01-01
  • 2021-11-28
  • 2019-01-15
  • 2016-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-23
  • 2021-01-16
相关资源
最近更新 更多