python-3.x Activate.ps1通过一个.bat文件自动打开一个带有venv指令的笔记本

ee7vknir  于 2023-03-24  发布在  Python
关注(0)|答案(1)|浏览(92)

大家好

有点新的venvs.我已经通过Powershell创建了一个,我用一个.bat文件激活,它工作正常,但它似乎也打开Activate.ps1在我的VS像一个笔记本或txt文件.
我可以关闭或离开它,程序工作正常,但我不知道这是Python/.bat/.ps1错误还是正常行为,但我不希望它打开,如果可能的话。
经过搜索,我在这里找到了这篇文章:Typing venv scripts activate.ps1 open Notebook auto
但是这篇文章有一个答案并不能解决我的问题,它有点不同,因为我的程序工作正常,即使这个文件自动打开

  • 使用Python 3.10.4

创建venv:

cd C:\Users\Me\Documents\DATA_SCIENCE\Projetos\Nome_Projeto\
python -m venv "C:\Users\Me\Documents\DATA_SCIENCE\Projetos\Nome_Projeto\Nome_do_Robo"

Nome_Projeto\Nome_do_Robo\Scripts\Activate.ps1
python -m pip install --upgrade pip

pip install -r "C:\Users\Me\Documents\DATA_SCIENCE\Projetos\_infos\Requirements\requirements_Robo.txt"

.bat文件:

@echo off
setlocal

cd C:\Users\Me\Documents\DATA_SCIENCE\Projetos\Nome_Projeto\Nome_do_Robo\Scripts\
set PYTHONPATH=C:\Users\Me\Documents\DATA_SCIENCE\Projetos\Nome_Projeto\Nome_do_Robo\Scripts\

set pathLog=C:\Users\Me\Documents\DATA_SCIENCE\Projetos\_Logs\Nome_Projeto
.
.(Others string variables)
.
set resultado=C:\Users\Me\Documents\DATA_SCIENCE\Projetos\_Resultados_dos_Robos\Nome_Projeto\

taskkill /IM python.exe /F

C:\Users\Me\Documents\DATA_SCIENCE\Projetos\Nome_Projeto\Nome_do_Robo\Scripts\Activate.ps1 & 
python C:\Users\Me\Documents\DATA_SCIENCE\Projetos\Nome_Projeto\ScrapStuff.py

我在Powershell和VS Studio中运行了.bat文件,都打开了以下注解(看起来像“how-to venv help”文件)
(File是真的很长,但如果需要,我粘贴整个内容)

<#
.Synopsis
Activate a Python virtual environment for the current PowerShell session.

.Description
Pushes the python executable for a virtual environment to the front of the
$Env:PATH environment variable and sets the prompt to signify that you are
in a Python virtual environment. Makes use of the command line switches as
well as the `pyvenv.cfg` file values present in the virtual environment.

.Parameter VenvDir
Path to the directory that contains the virtual environment to activate. The
default value for this is the parent of the directory that the Activate.ps1
script is located within.

.Parameter Prompt
The prompt prefix to display when this virtual environment is activated. By
default, this prompt is the name of the virtual environment folder (VenvDir)
surrounded by parentheses and followed by a single space (ie. '(.venv) ').

.Example
Activate.ps1
Activates the Python virtual environment that contains the Activate.ps1 script.

.Example
Activate.ps1 -Verbose
Activates the Python virtual environment that contains the Activate.ps1 script,
and shows extra information about the activation as it executes.

.Example
Activate.ps1 -VenvDir C:\Users\MyUser\Common\.venv
Activates the Python virtual environment located in the specified location.

.Example
Activate.ps1 -Prompt "MyPython"
Activates the Python virtual environment that contains the Activate.ps1 script,
and prefixes the current prompt with the specified string (surrounded in
parentheses) while the virtual environment is active.

.Notes
On Windows, it may be required to enable this Activate.ps1 script by setting the
execution policy for the user. You can do this by issuing the following PowerShell
command:

PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

For more information on Execution Policies: 
https://go.microsoft.com/fwlink/?LinkID=135170

#>
Param(
    [Parameter(Mandatory = $false)]
    [String]
    $VenvDir,
    [Parameter(Mandatory = $false)]
    [String]
    $Prompt
)

<# Function declarations --------------------------------------------------- #>

我有3个基本的脚本,运行在这个venv,如果需要,我可以分享它也
任何帮助将不胜感激!
谢谢!
删除venv和文件夹,重启桌面并在其他文件夹中重新创建整个venv。

7kqas0il

7kqas0il1#

批处理文件应如下所示:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
cd /D "%USERPROFILE%\Documents\DATA_SCIENCE\Projetos\Nome_Projeto"
if not errorlevel 1 goto TerminatePython

echo ERROR: Directory "%USERPROFILE%\Documents\DATA_SCIENCE\Projetos\Nome_Projeto" does not exist.
echo(
pause
exit /B 1

:TerminatePython
rem Gracefully terminate ALL currently running Python processes.
%SystemRoot%\System32\taskkill.exe /IM python.exe

call "Nome_do_Robo\Scripts\Activate.bat"

set "pathLog=%USERPROFILE%\Documents\DATA_SCIENCE\Projetos\_Logs\Nome_Projeto"
rem .
rem .(Others string variables)
rem .
set "resultado=%USERPROFILE%\Documents\DATA_SCIENCE\Projetos\_Resultados_dos_Robos\Nome_Projeto\"

python.exe "%USERPROFILE%\Documents\DATA_SCIENCE\Projetos\Nome_Projeto\ScrapStuff.py"
endlocal

前两个命令行完全定义了Windows * 命令处理器 * cmd.exe(解释批处理文件)处理批处理文件所需的执行环境。因此,批处理文件的工作独立于由启动cmd.exe的进程或可能调用此批处理文件的其他批处理文件在批处理文件外部定义的环境。
第三个命令行更改当前目录,如果目录不再存在,当然会失败。
如果更改当前目录失败,输出适当的错误消息以及空行和任何按键的提示以停止批处理文件处理,以给予用户有机会在文件管理器中双击启动批处理文件时读取错误消息。然后,使用退出代码1退出批处理文件处理,用于指示父进程的错误,并且cmd.exe运行隐式endlocal以恢复初始执行环境。
通过调用TASKKILL(不带其选项/F),可以优雅地终止接下来所有运行 Python 的进程。完全限定的文件名TASKKILL用于避免cmd.exe需要在文件系统中搜索此可执行文件,从而使批处理文件也在systemlocal环境变量PATH上工作。

TASKKILL向所有正在运行的python.exe进程发送WM_CLOSE message,这通常会导致python.exe停止解释 Python 脚本,关闭所有当前打开的文件,并将数据保存在为写操作打开的文件的流缓冲区中,关闭所有连接并终止。

使用TASKKILL选项/F会导致Windows操作系统残酷地杀死所有正在运行的 Python 进程,而不会让它们有机会执行优雅自终止所需的所有操作。
PowerShell脚本文件Activate.ps1用于在PowerShell控制台或PowerShell脚本中定义Python环境。它包含用于定义%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe内存中的环境变量的PowerShell cmdlet。
Windows * 命令处理器 * 不知道如何处理文件扩展名为.ps1的文件。因此,它调用ShellExecuteEx function,首先在Windows注册表中查找HKEY_CLASSES_ROOT\.ps1的默认字符串值Microsoft.PowerShellScript.1。然后查找HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\Open\Command的默认字符串值"C:\Windows\System32\notepad.exe" "%1"。然后ShellExecuteEx启动 *Windows记事本 *,使用PowerShell脚本文件的完全限定文件名作为参数,供用户编辑。
这里不需要这种行为。应该使用在cmd.exe的内存中重新定义环境变量处理批处理文件。因此,必须使用cmd内部命令call调用环境目录Nome_do_RoboScripts子目录中的批处理文件Activate.bat。这是使批处理文件按预期工作的最重要的修改。
有一个叫做python.exe的Python脚本文件的完全限定文件名,在定义了几个环境变量后作为参数运行。
Windows * 命令处理器 * 现在暂停批处理文件处理,直到 Python 可执行文件自行终止。然后显式执行cmd内部命令endlocal,以在由于到达批处理文件结束而退出批处理文件处理之前恢复初始环境。
要了解所使用的命令及其工作方式,请打开command prompt窗口,在其中执行以下命令,并仔细阅读显示的每个命令的帮助页面。

  • call /?
  • cd /?
  • x1米30英寸1x
  • endlocal /?
  • exit /?
  • if /?
  • pause /?
  • rem /?
  • set /?
  • setlocal /?
  • taskkill /?
    注意:Linux/Mac shell脚本命令行末尾的&指示shell解释器启动可执行文件或在后台指定的脚本文件的解释器,捕获已启动可执行文件的标准输出和标准错误流的所有输出,并将其输出到自己的标准输出和错误流中,并继续处理当前脚本或让用户输入更多命令在当前终端窗口中执行。Windows*命令处理器 * 将双引号参数字符串外的&符号解释为single line with multiple commands using Windows batch file所述的无条件命令运算符。因此,Windows批处理文件中命令行末尾的字符&没有意义。Windows批处理文件中Linux/Mac shell脚本命令行末尾的&等效于使用带有/B选项的命令start

请阅读DosTips论坛主题ECHO. FAILS to give text or blank line - Instead use ECHO/为什么echo(用于输出空行。与echo.echo/相比,cmd.exe在使用echo(时不会访问文件系统,并且只运行其内部命令echo以输出空行。

相关问题