如何通过Python子进程模块传递反斜杠作为参数?

时间:2015-11-03 00:12:34

标签: python subprocess command-line-arguments

我想使用Python的子进程调用一个命令行程序,该程序需要一个路径作为参数传入。因为这是在Windows上,路径包括反斜杠。我尝试了很多选项,其中一些程序设置打印出从子进程接收的路径参数:

Escaped反斜杠:

>>> cmd = ['f:\\code\\Util.exe', '-i', 'c:\\Users\\paul\\data.xml']
>>> subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
>>> subprocess.communicate()
('Input path: c:\\Users\\paul\\data.xml\n', '...')

单反斜杠,原始格式:

>>> cmd = ['f:\\code\\Util.exe', '-i', r'c:\Users\paul\data.xml']
>>> subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
>>> subprocess.communicate()
('Input path: c:\\Users\\paul\\data.xml\n', '...')

单反斜杠:

>>> cmd = ['f:\\code\\Util.exe', '-i', 'c:\Users\paul\data.xml']
>>> subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
>>> subprocess.communicate()
('Input path: c:\\Users\\paul?5data.xml', '...')

在每种情况下,反斜杠都以双反斜杠的形式传递给Windows程序。有没有办法将单个反斜杠传递给被调用的程序?

2 个答案:

答案 0 :(得分:3)

你对输出感到困惑。 Popen.communicate()为您提供了一个元组,其中包含stdout和stderr流。因为你得到一个元组,所以通过repr()函数显示该元组的内容。您的字符串值不包含双反斜杠,但由于此类反斜杠在Python字符串文字中具有特殊含义,因此它们以Python文字形式显示为doubled:

>>> value = r'foo\bar'
>>> value
'foo\\bar'
>>> print value
foo\bar
>>> print (value,)  # tuple
('foo\\bar',)
>>> print (value,)[0]  # back to one string
foo\bar

换句话说:这里没有问题,你得到单个反斜杠,但Python给你文字符号表示(为了便于调试)。

答案 1 :(得分:0)

第一种形式,你加倍,是应该工作的形式。但要注意,当Python在引号中显示字符串时,它将添加转义符。例如,如果您键入'\\',则解释器会显示完全相同的内容。但实际上它只是一个反斜杠。您可以通过执行len('\\')print '\\'来查看此内容。

所以我的问题是,你是否某些反斜杠被加倍,或者Python只是在显示它们时逃避它们?