2013-10-25 33 views
0

實際上,我試圖將下面的代碼傳遞給bash。但我認爲tshark和pythonic%s的%s是以某種方式混合的。它沒有提供足夠的參數格式字符串錯誤。將參數傳遞給bash時子進程會混淆

def traffic_dest_port(self,filepcap): 
    cmd = "tshark -o column.format:'\"Source\", \"%s\", \"Destination\", \"%d\", \"dstport\", \"%uD\"' -r %s |sort|uniq " %filepcap 
    subprocess.call(cmd,shell=True) 

你能幫我解決嗎?

謝謝。

+0

兩件事情,這將使你的代碼更容易寫,讀,並調試:(1)使用三引號字符串而不是轉義引號,(2)讓Python使用['shlex.quote']爲你做一些工作(http://docs.python.org/ 3.3 /庫/ shlex.html#shlex.quote)。 – abarnert

+0

有一件事會讓它更容易:如果你不需要的話,不要使用shell。請參閱子流程文檔中的[替換外殼管道](http://docs.python.org/3.3/library/subprocess.html#replacing-shell-pipeline)。 – abarnert

回答

0

你說得對。 Python的%運算符將嘗試在字符串中每隔%替換,而不僅僅是其中的一部分。由於它找到4 %說明符,並且只有一個值,所以它會說TypeError: not enough arguments for format string

但是,即使沒有,你是如何猜測你想從哪四個中取代哪一個呢?我是一個人,即使我沒有猜測,所以如果我猜錯了,希望你能弄清楚如何調整答案以適應你的需求。解決此


一種方式是逃避你不想Python的他們加倍處理百分比:

cmd = "tshark -o column.format:'\"Source\", \"%%s\", \"Destination\", \"%%d\", \"dstport\", \"%%uD\"' -r %s |sort|uniq " %filepcap 

由於上printf-style String Formatting的文檔中描述的那樣,符%%表示「沒有說法被轉換,導致結果中有'%'字符。「

如果你打印出結果(你應該總是嘗試調試這樣的東西!時),你會看到%s已被filepcap值代替,但是%%s已經變成%s


然而,一個更容易的解決方法就是使用不同格式的機制,不需要%,像str.format

cmd = "tshark -o column.format:'\"Source\", \"%s\", \"Destination\", \"%d\", \"dstport\", \"%uD\"' -r {} |sort|uniq ".format(filepcap) 
+0

非常感謝第二種方法的作品。欣賞 – CorpusCallosum