我正在尝试创建一个make.bat文件,其功能类似于* nix系统上的Makefile,作为cookiecutter项目模板的一部分。面临的挑战是想出一种方法,当将控制权传递回命令提示符时,该方法能够激活conda环境并使该环境仍然处于活动状态。
这是make.bat文件的外观。另外,如果您要注意,由于Windows环境的原因,activate
和deactivate
命令的前缀不是source
或conda
。
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: 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环境进行工作。
如您在屏幕快照中所见,激活环境时,它并不会在命令提示符下持久保存。
对此非常感谢。这使我发疯了很长一段时间。
答案 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。