【问题标题】:Batch equivalent of "source" on Windows: how to run a Python script from a virtualenvWindows 上“源”的批处理等效项:如何从 virtualenv 运行 Python 脚本
【发布时间】:2011-07-21 19:43:05
【问题描述】:

我已经编写了相当多的 bash 脚本,但很少在 Windows 上编写批处理脚本。我正在尝试激活 Python virtualenv,运行 Python 脚本,然后在脚本退出时停用 virtualenv。

我有一个名为 env 的文件夹,这是我的 virtualenv,还有一个名为 work 的文件夹,其中包含我的脚本。

这是我目前得到的:

%~dp0env\Scripts\activate.bat
python %~dp0work\script.py
deactivate

但是,当我运行脚本时,它会激活 virtualenv 然后停止。它没有到达第二行并运行 Python 脚本。有没有办法“获取”激活脚本文件夹,以便可以像从命令行调用 activate.bat 一样运行批处理脚本的其余部分?

【问题讨论】:

    标签: python windows scripting batch-file virtualenv


    【解决方案1】:

    我想说你只需要在你的 activate.bat 调用前面加上“调用”,以确保在执行激活后恢复当前的批处理文件:

    call %~dp0env\Scripts\activate.bat
    

    考虑对deactivate.bat 执行相同的操作。此外,如果您想确保当前 cmd.exe 环境不会被对批处理文件的调用污染,请考虑将您的命令包装在 setlocal/endlocal 命令对中。

    【讨论】:

    • 我会试试这个,但这似乎正是我想要的。谢谢!
    • @Nicola 如果batch1.bat 包含batch2.batecho 1,batch2.bat 包含echo 2,我运行batch1.bat,我看到一个新的shell 打开,然后2 ,然后1,所以我认为这不是问题。
    • 来自“调用”命令文档:“在不停止父批处理程序的情况下从另一个批处理程序调用。” (technet.microsoft.com/en-us/library/cc732835%28WS.10%29.aspx)
    • @Nicola 在不停止父批处理程序的情况下从另一个批处理程序调用。这不是您想要的,对吧? :)
    • 这正是我们想要的。文档不是很清楚,他们应该说terminating 而不是stopping。他们的意思不是某种并行执行。相反,如果您不使用call 命令,则调用批处理的执行将替换为被调用批处理的执行,即调用批处理中的后续指令将被丢弃。使用call 命令在被调用者终止后继续执行调用批处理。
    【解决方案2】:

    我创建了一个指向 cmd /k "path/to the/script/activate.bat" 的 .lnk 文件,它可以工作。

    CMD parameters & options

    【讨论】:

      【解决方案3】:

      我想您只想在 Windows 中执行与在 Linux Bash/shell 中预期相同的命令。当我想启动一个 virtualenv 时,我实际上是在它的顶层目录中,Linux 命令将是“source bin/activate”。

      在 Windows 上模拟这种行为是没有问题的。就我个人而言,我在 PATH 环境变量中的某处放置了一个名为 activate.bat 的批处理文件,如下所示:

      :: 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-15
        • 2021-03-28
        • 1970-01-01
        • 2012-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-10
        相关资源
        最近更新 更多