首页 > 解决方案 > cmd 和 bat 行为不同

问题描述

编辑:

在与同事讨论该问题后,我们认为我们知道为什么 .bat 的运行方式与在 cmd 窗口中逐行键入时不同。我们认为该行在./venv/Scripts/activate.bat与其余代码运行的地方不同的 shell 中激活了一个虚拟环境。从该行开始,我需要所有代码在同一个 shell 中运行。(仅供参考,我不确定这是否有意义,因为我对此比较陌生。)

我正在尝试通过运行带有必要命令的 bat 文件来创建虚拟环境。当我通过将 .bat 代码中的行复制粘贴到 cmd 窗口并单独运行每行来运行时,代码按预期工作。但是,当我运行 .bat 文件时,它不起作用。

我认为挑战来自 bat 脚本必须在目录中移动的事实,因为必须在本地文件夹中创建虚拟环境,而它随后调用的脚本和文件托管在网络文件夹中。

此设置无法更改,因此我需要能够在 .bat 文件中正确移动目录。

我在 StackOverflow 中环顾四周,找不到与类似行为相关的任何问题。我一直在阅读相关文档,但还没有发现任何有用的东西。我正在运行 anaconda3 发行版。Windows 10。我不确定哪些信息可能有助于排除故障,所以如果您需要更多信息,请告诉我。你会在下面找到我的代码。

echo ON

REM Change directory to user's local dir
chdir C:\Users\USERNAME
C:

REM Check whether environments folder exists, if not, create it.
if not exist "C:\Users\USERNAME\Environments\" mkdir C:\Users\USERNAME\Environments

REM Create virtual environment in this new/existing folder and activate it.
python -m venv venv/
"./venv/Scripts/activate.bat"

REM Change directory to network drive where document files are located
chdir I:\NETWORKDIR_PATH\FOLDER_OF_INTEREST
I:

REM Make sure necessary packages are installed.
pip install -r ./src/requirements.txt

REM Run script and close shell after 20 secs
python "./src/main_script.py"

REM FOLDER_OF_INTEREST contains the following items:
REM two excel files which will interact with the main_script.py script
REM a folder called "src" which has the packages to be installed within my environment
REM "src" also contains two python scripts. The first is the main_script.py, the other contains functions called by main_script.py

就目前而言,当我在 cmd 窗口中单独运行每一行时,一切正常。

如果我尝试运行 .bat 文件,代码会运行到

python -m venv venv/
"./venv/Scripts/activate.bat"

此时,cmd窗口退出并且没有其他任何事情发生......

任何帮助/建议表示赞赏!

PS:ping命令在那里,因为如果没有,cmd窗口退出太快,我看不到发生了什么。

标签: pythonbatch-filecmd

解决方案


我们认为 ./venv/Scripts/activate.bat 行在与其余代码运行的地方不同的 shell 中激活了一个虚拟环境。

不会。批处理文件逐行执行,直到遇到EOF(文件结束)。所以在结束时activate.bat,解释器认为它的工作完成了,就是这样。

为了能够“返回”到调用脚本,需要调用被调用脚本(基本上省了一个返回点)

要从字面上启动另一个cmd实例中的脚本(您称之为“shell 中的虚拟环境”),您需要start命令。


推荐阅读