python - 当 $env :path? 中定义了多个时,windows 如何决定使用哪个 python 可执行文件

标签 python python-3.x windows powershell executable

where.exe python 所示,我在默认的 powershell 提示符中有几个可用的 python 可执行文件:

C:\Program Files\Inkscape\bin\python.exe
C:\Users\921479\AppData\Local\Programs\Python\Python310\python.exe
C:\Users\921479\AppData\Local\Microsoft\WindowsApps\python.exe

当我从这个 powershell 提示启动 python 解释器时,它使用第一个可执行文件:

>>>python
Python 3.9.7 (default, Sep 22 2021, 08:12:47)  [GCC 10.3.0 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path
['', 'C:\\Program Files\\Inkscape\\lib\\python39.zip', 'C:\\Program Files\\Inkscape\\lib\\python3.9', 'C:\\Program Files\\Inkscape\\lib\\python3.9\\lib-dynload', 'C:\\Users\\921479', 'C:\\Program Files\\Inkscape\\lib\\python3.9\\site-packages']

我不想从我的 Windows 路径环境变量中删除 C:\Program Files\Inkscape\bin,因为我将 inkscape 命令行工具用于其他目的。但是,我更希望 powershell 使用本地安装的 python 3.10 作为我的“默认”python 解释器。

当我检查 $env:path 变量时,看起来 Inkscape 文件夹是在 python 3.10 文件夹之后定义的。所以它看起来像其他东西被用来解析 python 可执行文件:

>>>$env:path
C:\Python310\Scripts\;C:\Python310\;C:\Python39\Scripts\;C:\Python39\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\ProgramData\chocolatey\bin;C:\Users\921479\AppData\Local\SumatraPDF;C:\Program Files\Git\cmd;C:\texlive\2021\bin\win32;C:\Program Files (x86)\PDFtk Server\bin\;C:\Program Files (x86)\Lua\5.1;C:\Program Files (x86)\Lua\5.1\clibs;C:\Program Files\Inkscape\bin;C:\Program Files\dotnet\;C:\Users\921479\AppData\Local\Programs\Python\Python310\Scripts\;C:\Users\921479\AppData\Local\Programs\Python\Python310\;C:\Users\921479\AppData\Local\Microsoft\WindowsApps;C:\Users\921479\.dotnet\tools

powershell/windows 如何决定使用哪个 python 可执行文件?我该如何修改它?

最佳答案

Thomas Weller's helpful answer提供了很好的一般信息。

关于在 PowerShell直接调用可执行文件仅按名称(包括或不包括其文件扩展名):

  • 仅在 $env:Path 中列出的目录中查找按名称指定的可执行文件,按顺序,可执行文件来自 < em>首先使用匹配目录。

    • 请注意,与 cmd.exe 不同,PowerShell 作为一项安全功能在设计上执行位于当前 目录,并要求您通过在名称前加上 .\(或使用完整路径)来明确调用此类程序的意图。

    • 换句话说:如果python.exe 可执行文件恰好出现在当前 目录中,提交python:

      • cmd.exe 中将执行
      • 而 PowerShell 会忽略它并仅引用 $env:PATH

与您的体验一致:即使您的 $env:Path 变量包含 C:\Python310\C:\Python39\C:\Program Files\Inkscape\bin 之前,它们包含 python.exe 可执行文件,正如您的 where.exe 命令输出所暗示的那样,它表明唯一相关的目录是 C:\Program Files\Inkscape\binC:\Users\921479\AppData\Local\Programs\Python\Python310,和 C:\Users\921479\AppData\Local\Microsoft\WindowsApps 反射(reflect)在您的 $env:Path 值中的顺序。

PowerShell 中 where.exe 调用的等价物 将是(PowerShell 从不在当前 目录中列出任何匹配项除外),使用 Get-Command命令:

Get-Command python -All

省略 -All 将仅显示命令的有效 形式,即调用时实际使用的形式。


How can I modify this?

再次从 PowerShell 的角度: 根据您的需要,您有两种选择:

  • 您可以选择性地修改 $env:PATH 仅用于当前的 PowerShell session ,这将将修改后的查找顺序限制为 session 从中启动的进程。独立进程(例如单独的 cmd.exe session )不会受到影响:

    # Simply *prepend* the desired directory to $env:Path
    $env:Path = 'C:\Users\921479\AppData\Local\Programs\Python\Python310;' + $env:Path
    
  • 如果您想将修改后的查找顺序限制为仅限 PowerShell 代码 - 即 pythonpython .exe 调用以交互方式或从 PowerShell 脚本或函数提交 - 您可以定义 aliases .

     New-Alias python.exe C:\Users\921479\AppData\Local\Programs\Python\Python310\python.exe
     New-Alias python python.exe
    

在这两种情况下,如果您想自动实现这些修改,对于所有 future 的 PowerShell session ,将语句添加到您的 $PROFILE file .

关于python - 当 $env :path? 中定义了多个时,windows 如何决定使用哪个 python 可执行文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69691613/

相关文章:

python - 如何根据条件复制数据框行

python - 如何在 swift 3.0 中进行 rest api post 调用

'htop, atop' 实用程序中的 python termios 模式

python-3.x - 如何使用opencv python查找图像中的最小矩形?

windows - csrss.exe 进程有什么作用?

windows - 使用协议(protocol)处理程序(即 :url))从 Chrome 打开 Internet Explorer

python - 如何检查当前tensorflow版本是否至少是python脚本中的特定版本?

python - 在/tmp/pip_build_root/confluent-kafka 中安装失败,错误代码为 1

python - On_Reaction_Add() 以及在 On_Ready() Discord.PY 中发送的消息

windows - 如何禁用 Visual C++ 运行时中的缓冲区溢出检查?