2015-11-03 81 views
1

我想用Python的子进程来调用一个命令行程序,它需要一个路径作为参数传入。因为这是在Windows上,所以路径包含反斜杠。我已经尝试了许多选项供子收到与设置打印出来的路径参数的程序几个在这里的是:如何通过Python子进程模块将反斜杠作为参数传递?

转义反斜线:

>>> 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', '...') 

单反斜线,RAW格式:

>>> 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', '...') 

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

+0

使用带'r'thisisyourstring'''r'前缀的'raw str' –

+0

@R Nar:恩,是不是我在上面的第二个例子中做了什么? – Pawelek

+0

对不起,我没有看到! –

回答

3

你对输出感到困惑。 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为您提供了文字表示法(便于调试)。

0

第一种形式,你把它们加倍,是应该工作的。但是,请注意,当Python在引号中显示一个字符串时,它将会添加转义。例如,如果你输入'\\',解释器显示完全相同的东西。但实际上它是一个反斜线。你可以通过做len('\\')print '\\'来看到。

所以我的问题是,你是某些反斜杠正在翻倍,还是Python只是在显示它们时逃脱它们?

+0

我没有从Python中显示它们。我是来自C#Util.exe代码的Console.Writeline()。所以是的,Python将它们作为文字双斜杠传递给其他程序。 – Pawelek

+0

那么,问题是* not *在你传递给'Popen'的字符串中。在某个地方,某些事情正在决定它需要逃避这些角色。 –

相关问题