Windows下"source"的批处理等价:如何从虚拟环境运行Python脚本
我在写bash脚本方面有一些经验,但在Windows上写批处理脚本的经验很少。我想要做的是激活一个Python的虚拟环境,运行一个Python脚本,然后在脚本结束后再关闭这个虚拟环境。
我有一个叫做 env
的文件夹,这就是我的虚拟环境,还有一个叫做 work 的文件夹,里面放着我的脚本。
这是我目前写的内容:
%~dp0env\Scripts\activate.bat
python %~dp0work\script.py
deactivate
不过,当我运行这个脚本时,它会激活虚拟环境,但之后就停止了。它没有继续到第二行去运行Python脚本。有没有办法“源”一下激活脚本的文件夹,这样后面的批处理脚本就可以像我在命令行中直接调用 activate.bat
一样运行?
3 个回答
2
我想你是想在Windows上执行一些和Linux Bash/shell里一样的命令吧。当我想启动一个虚拟环境时,我通常是在它的顶层目录下,而在Linux里我会用“source bin/activate”这个命令。
在Windows上模拟这个操作其实没什么问题。我个人是把一个叫做 activate.bat
的批处理文件放在了PATH环境变量中的某个地方,像这样:
:: activate.bat
@echo off
REM source bin/activate
if "%1" == "bin/activate" (
if not EXIST "%CD%\Scripts\activate.bat" goto notfound
set WRAPEX=Scripts\activate.bat
) ELSE (
set WRAPEX=%*
)
call %WRAPEX%
goto :eof
:notfound
echo Cannot find the activate script -- aborting.
goto :eof
6
我创建了一个.lnk文件,这个文件指向 cmd /k "path/to the/script/activate.bat"
,结果运行得很好。
64
我觉得你只需要在调用 activate.bat 的时候前面加上 'call',这样可以确保在执行完 activate 之后,当前的批处理文件会继续运行:
call %~dp0env\Scripts\activate.bat
你也可以对 deactivate.bat
做同样的处理。此外,如果你想确保当前的 cmd.exe 环境不会被你的批处理文件影响,可以考虑把你的命令放在 setlocal
和 endlocal
这对命令之间。