0

实际上,我正在尝试将以下代码传递给 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)

你能帮我解决这个问题吗?

谢谢。

4

1 回答 1

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)
于 2013-10-25T18:59:48.387 回答