2016-12-25 49 views
2

我試圖用鉛在Python中執行以下命令傳遞$:Python的鉛:在cmd參數

sort -u -f -t$'\t' -k1,1 file1 > file2 

傳遞-t$'\t'說法不過,我有問題。這裏是我的代碼:

from plumbum.cmd import sort 
separator = r"-t$'\t'" 
print separator 
cmd = (sort["-u", "-f", separator, "-k1,1", "file1"]) > "file2" 
print cmd 
print cmd() 

print separatorprint cmd()執行,我可以看到問題的時候了:

-t$'\t' 
/usr/bin/sort -u -f "-t\$'\\t'" -k1,1 file1 > file2 
  1. 的說法是雙引號括起來。
  2. 插入$和$ t之前的額外\。

我應該如何將這個論點傳遞給鉛?

+0

你試過這個:'separator =「-t $'\ t'」'?你可以解釋這是一種將TAB作爲字段分隔符的方法。順便說一句,你知道這是非常非常容易做到使用python只是嗎? –

+0

@ Jean-FrançoisFabre這個參數看起來像這個命令裏面的內容:「-t \ $'\\ t'」(帶雙引號)。 – SteveB

+0

然後,應該工作,嘗試它。 –

回答

1

您可能已經偶然發現了命令行轉義的侷限性。

我可以使它工作使用subprocess模塊,litteraly傳遞一個真正的製表字符:

import subprocess 

p=subprocess.Popen(["sort","-u","-f","-t\t","-k1,1","file1",">","file2"],shell=True) 
p.wait() 

此外,完整的Python短期的解決方案,你想要做什麼:

with open("file1") as fr, open("file2","w") as fw: 
    fw.writelines(sorted(set(fr),key=lambda x : x.split("\t")[0])) 

完整的蟒蛇解決方案在處理unicity時不會以與sort完全相同的方式工作。如果2行具有相同的第一字段但不相同的第二字段,則sort保留其中之一,而set將保留兩者。

編輯:未選中,而你只不過證實了它的工作原理:只需調整與鉛代碼:

separator = "-t\t" 

可能只是工作,儘管出3米的人的,我建議,因爲它的完整解決方案蟒不涉及外部過程,因此更加pythonic和便攜式。

+0

你實際上通過改變參數來解決它:「-t \ t」。這很簡單。謝謝! – SteveB

+0

其實我認爲它會解決它,因爲我有'subprocess.Popen'完全相同的問題,並解決它。非常有趣的問題! –

+0

感謝您解決這個問題。至於完整的python解決方案,使用鉛筆要容易得多,因爲我正在做很多shell腳本。如果是這樣的話,不使用鉛是更有意義的。 – SteveB