我在默認的 powershell 提示符中有幾個可用的 python 可執行檔案,如下所示where.exe 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']
我不想C:\Program Files\Inkscape\bin從我的 Windows 路徑環境變數中洗掉,因為我將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使用哪個可執行檔案?我該如何修改?
uj5u.com熱心網友回復:
Windows 將執行的內容并非微不足道,因為它可能取決于所使用的 API。
其中之一是CreateProcessW:
- 應用程式加載的目錄。
- 父行程的當前目錄。
- 32 位 Windows 系統目錄。使用 GetSystemDirectory 函式獲取該目錄的路徑。
- 16 位 Windows 系統目錄。沒有獲取這個目錄路徑的函式,但是會搜索。該目錄的名稱是 System。
- Windows 目錄。使用 GetWindowsDirectory 函式獲取該目錄的路徑。
- PATH 環境變數中列出的目錄。請注意,此函式不會搜索 App Paths 注冊表項指定的每個應用程式路徑。要在搜索序列中包含此每個應用程式的路徑,請使用 ShellExecute 函式。
從 Windows Vista 開始,環境變數 %NoDefaultCurrentDirectoryInExePath% 配置是否應搜索當前目錄(來源:MSDN)。
另外:如果你只是在python沒有擴展的情況下運行,環境變數 %PathExt% 用于查找可執行擴展。(來源:MSDN)。
PATHEXT 變數的默認值是:.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
解決此類問題的一個很好的工具是SysInternals Process Monitor。為“路徑包含 python”(不是 python.exe)設定一個過濾器,你會看到確切的搜索順序。對于不包含 Python 可執行檔案的目錄,它將報告“NO SUCH FILE”。
另請注意:DLL的搜索順序可能不同。
uj5u.com熱心網友回復:
Thomas Weller 的有用回答提供了很好的一般資訊。
至于在 PowerShell 中僅按名稱直接呼叫可執行檔案(包括或不包括其檔案擴展名):
在
$env:Path, order 中列出的目錄中查找僅按名稱指定的可執行檔案,并使用第一個匹配目錄中的可執行檔案。- 請注意,PowerShell - 與
cmd.exe設計不同- 作為一種安全功能,它不會僅按名稱執行位于當前目錄中的可執行檔案,并且要求您通過在名稱前加上前綴.\(或使用完整路徑)。
- 請注意,PowerShell - 與
這是你的經驗是一致的:即使你的$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,這是體現在為了在你的$env:Path價值中。
在你的相當于where.exePowerShell中的通話將(除PowerShell的上市從來沒有在任何比賽當前目錄下),使用Get-Command的cmdlet:
Get-Command python -All
省略-All將僅顯示命令的有效形式,即實際用于呼叫的形式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/334683.html
