Python sys.argv从命令行自动转义我的参数?

时间:2015-06-23 03:31:21

标签: python linux shell

我正在尝试构建一个脚本需要来自' grep'在linux shell中 但是,我发现Python sys.argv从命令行转义了我的正则表达式模式 例如,我将通过' \ 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需要逃避我的命令行参数,我想要一种方法来获得一个简单的,未转义的字符串。

修改

令人印象深刻的是&#39; \\ d&#39; ==&#39; \ d&#39;。
但在我的情况下,我需要像这样将字符串传递给子进程。

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

很明显,\\ d已经传递给shell。但是,我需要它只是\ d而不是\\ d。除了手动替代之外还有什么方法吗?

2 个答案:

答案 0 :(得分:2)

这就是Python解释器打印字符串的方式。您的print来电显示字符串未真正转义。

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

另请注意,'\d''\\d'是编写相同字符串的两种方式。

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

答案 1 :(得分:2)

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