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

如何通过Python子流程模块将反斜杠作为参数传递?,python,subprocess,command-line-arguments,Python,Subprocess,Command Line Arguments,我想使用Python的子进程调用一个命令行程序,该程序需要一个路径作为参数传入。因为这是在Windows上,所以路径包含反斜杠。我尝试了许多选项,其中一些选项在这里设置为打印从子流程收到的path参数: 转义反斜杠: >>> cmd = ['f:\\code\\Util.exe', '-i', 'c:\\Users\\paul\\data.xml'] >>> subprocess.Popen(cmd, stdout=subprocess.PIPE, stder

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

转义反斜杠:

>>> 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', 'c:\Users\paul\data.xml']
>>> subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
>>> subprocess.communicate()
('Input path: c:\\Users\\paul?5data.xml', '...')
单个反斜杠,原始格式:

>>> 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\\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程序。有没有办法将一个反斜杠传递给被调用的程序?

第一个表单应该可以使用,您可以将它们对折。但是,请注意,当Python在引号中显示字符串时,它将添加转义。例如,如果键入
'\\'
,则带的解释器将显示完全相同的内容。但实际上,这是一个单一的反斜杠。通过执行
len('\\')
print'\\'
可以看到这一点


所以我的问题是,您确定后斜杠是加倍的,还是Python只是在显示它们时转义它们?

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

>>> 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为您提供了文字表示法(便于调试)。

使用
raw str
r'thisisyourstring'
r
prefix@R纳尔:嗯,这不是我在上面第二个例子中所做的吗?对不起,我没看到!输出为您提供单斜杠。但是输出作为Python字符串文本转义。这里没有问题。@Busterdust:我同意它更干净,但仍然不起作用:)我不是从Python显示它们。我正在从C#Util.exe代码中编写它们。是的,Python将它们作为文本双反斜杠传递给另一个程序。问题不在于传递给
Popen
的字符串。在这条路线的某个地方,某种东西决定了它需要逃离那些角色。