2015-11-03 102 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'的字符串中。在某個地方,某些事情正在決定它需要逃避這些角色。 –

相關問題