将参数传递给bash时,子流程会出现混淆

时间:2013-10-25 18:52:33

标签: python subprocess tshark

其实我试图将下面的代码传递给bash。但我认为tshark和pythonic%s的%s会以某种方式混合。它没有提供足够的参数格式字符串错误。

 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)
你可以帮我解决这个问题吗?

感谢。

1 个答案:

答案 0 :(得分: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)