【发布时间】:2020-05-08 03:02:21
【问题描述】:
我正在尝试在 *nix 系统上创建一个功能类似于 Makefile 的 make.bat 文件,作为 cookiecutter 项目模板的一部分。挑战在于找到一种能够激活 conda 环境并在将控制权传递回命令提示符时使该环境仍然处于活动状态的方法。
这是 make.bat 文件的样子。另外,如果你注意了,activate 和 deactivate 命令由于 Windows 环境的原因没有以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 环境工作。
正如您在屏幕截图中看到的那样,当环境被激活时,它不会在命令提示符处继续存在。
非常感谢您对此的任何帮助。这让我发疯了很长时间。
【问题讨论】:
-
我在你的图片中注意到
(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