如 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\bin
,
C:\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 代码 - 即
python
和python .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/