簡體   English   中英

Python sys.argv從命令行自動轉義我的參數?

[英]Python sys.argv auto-escaped my arguments from command line?

我試圖建立一個腳本,需要linux shell中'grep'的支持。
但是,我發現Python sys.argv從命令行轉義了我的regex模式。
例如,我要從命令行傳遞'\\ d'作為grep模式。
但是sys.argv [1]返回的字符串被轉義為'\\\\ d'

我在調試模式下進行了以下測試:

#SyntaxTest.py
import sys
  #other stuff preventing my debugger from stopping after importing

#shell
python3 -m pdb SyntaxTest.py '\d'

> /cygdrive/d/PythonSandBox/SyntaxTest.py(1)<module>()
-> import sys
(Pdb) n
(Pdb) sys.argv[1]
'\\d'
(Pdb) print(sys.argv[1])
\d

我想知道為什么Python需要轉義我的命令行參數,並且在我的示例中要求一種獲取純凈的,未轉義的字符串的方法。

編輯

'\\\\ d'=='\\ d'令人印象深刻。
但是在我的情況下,我需要像這樣將字符串傳遞給子進程。

>>> pattern = '\d'
>>> str = r"echo '%s'"%pattern
>>> str
"echo '\\d'"
>>> subprocess.check_output(str,shell=True)
b'\\d\n'

顯然\\\\ d已傳遞給shell。 但是,我需要它只是\\ d而不是\\\\ d。 除了手動替代之外,還有其他方法嗎?

這就是Python解釋器打印字符串的方式。 您的print呼叫顯示該字符串並未真正轉義。

>>> '\d'
'\\d'
>>> '\\d'
'\\d'
>>> print('\d')
\d
>>> print('\\d')
\d

還要注意, '\\d''\\\\d'是編寫同一字符串的兩種方式。

>>> '\d' == '\\d'
True

Python沒有逃脫您的shell參數。 這是反斜杠字符的表示方式,因為反斜杠是轉義字符,所以為了在字符串中字面意義使用 ,它必須被轉義。

例如,您必須知道print '\\n'將打印換行符

// Python REPL:
>>> print 'a\nb'
a
b

如果要打印文字 \\ n字符串,則必須用另一個反斜杠轉義反斜杠字符:

// Python REPL:
>>> print 'a\\nb'
a\nb

因此,加倍的反斜杠只是在Python字符串中表示文字反斜杠的方式(我想幾乎所有的編程語言都采用這種斜杠,因為這是一種標准)。

有關更多信息,請參見https://en.wikipedia.org/wiki/Escape_character

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM