从批处理文件激活conda环境并保持激活状态?

时间:2020-01-22 01:34:16

标签: python batch-file

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

这是make.bat文件的外观。另外,如果您要注意,由于Windows环境的原因,activatedeactivate命令的前缀不是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环境进行工作。

如您在屏幕快照中所见,激活环境时,它并不会在命令提示符下持久保存。

enter image description here

对此非常感谢。这使我发疯了很长一段时间。

1 个答案:

答案 0 :(得分: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,使用前将环境重置为 SETLOCAL中的。 activate脚本需要在全局中调用 范围保持活动状态,以便在命令提示符下使用。

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

我删除了将ECHO>结合使用的双引号和 并以^逃逸成为^>

使用双引号而不是SET

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