將 Windows 中的帶引號目錄傳遞給 Python 時,我看到一個令人討厭的尾隨雙引號。
這是我的 Python 測驗程式,print_args.py:
import sys
print(sys.argv)
這是我從命令列運行它時得到的。請注意,參考的目錄是 Windows shell 中的制表符完成生成的標準格式。由于路徑中有空格,因此需要雙引號。
>py print_args.py -test "C:\Documents and Settings\"
['print_args.py', '-test', 'C:\\Documents and Settings"']
尾隨反斜杠已被雙引號替換,大概是因為 Python 將其讀取為帶引號的雙引號,而不是將其與前導引號匹配。
如果不是將引數傳遞給 Python,而是將其傳遞給一個批處理腳本,它只是回顯它,那么我會得到預期的尾部反斜杠。
因此,在看到 sys.argv 的 CMD shell 和 Python 之間的某個地方,存在一些影響反斜杠和雙引號的決議。
任何人都可以照亮嗎?
編輯添加:
進一步閱讀表明,Python 正在對 Windows 命令列引數進行一些決議以構造 sys.argv。我認為 Windows 將整個命令列字串(在這種情況下大部分未更改)傳遞給 Python,Python 使用自己的內部邏輯將其分解為 sys.argv 串列中的字串。此處理必須允許轉義雙引號作為特殊情況。我很高興看到一些檔案或代碼......
uj5u.com熱心網友回復:
您需要轉義反斜杠,因為反斜杠本身就是 Python 和 PowerShell 的轉義字符。否則,\"意味著傳入一個"文字而不是使用它來包圍字串。以下對我來說很好:
PS> py print_args.py -test "C:\\Documents and Settings\\"
輸出:
['rando.py', '-test', 'C:\\Documents and Settings\\']
uj5u.com熱心網友回復:
Windows 上的命令列處理不是完全標準化的,但在 Python 和許多其他程式的情況下,它使用 Microsoft C 運行時行為。例如,這是在此處指定的。它說
用雙引號括起來的字串被解釋為單個引數,其中可能包含空格字符。[...] 如果命令列在找到右雙引號之前結束,那么到目前為止讀取的所有字符都將作為最后一個引數輸出。
前面有反斜杠 (") 的雙引號被解釋為文字雙引號 (")。
這兩條規則中的第二條防止將第二個雙引號讀作終止引數 - 而是附加一個雙引號。然后第一條規則允許引數在沒有終止雙引號的情況下結束。
請注意,本節還說
Microsoft C/C 代碼使用的命令列決議規則是 Microsoft 特定的。
這在使用 PowerShell 時更加令人困惑。
PS> py print_args.py -test 'C:\Documents and Settings\'
['print_args.py', '-test', 'C:\\Documents and Settings"']
此處 PowerShell 決議保留最后的反斜杠并洗掉單引號。然后它在將命令列傳遞給 C 運行時之前添加雙引號(因為路徑中的空格),C 運行時根據規則對其進行決議,轉義 PowerShell 添加的雙引號。
但是,這一切都符合記錄的行為并且不是錯誤。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/435005.html
上一篇:如何解決/bin/sh:1:source:在MacOS(Golang)中制作docker鏡像時找不到?
下一篇:提取日期的T-SQL函式
