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

Python 将参数传递给bash时,子流程会混淆,python,subprocess,tshark,Python,Subprocess,Tshark,实际上,我正在尝试将下面的代码传递给bash。但我认为tshark的%s和pythonic的%s不知怎么混在一起了。它没有给出足够的参数格式字符串错误 def traffic_dest_port(self,filepcap): cmd = "tshark -o column.format:'\"Source\", \"%s\", \"Destination\", \"%d\", \"dstport\", \"%uD\"' -r %s |sort|uniq " %filepcap

实际上,我正在尝试将下面的代码传递给bash。但我认为tshark的%s和pythonic的%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)
你能帮我解决这个问题吗


谢谢

你的猜测是对的。Python的
%
操作符将尝试替换字符串中的每个
%
说明符,而不仅仅是其中的一部分。因为它找到了4个
%
说明符,并且只有一个值,所以它会说
类型错误:格式字符串的参数不够

但是,即使它没有,你怎么能指望它猜出你想要它在这四个中替换哪一个呢?我是一个人,甚至连我都猜不透,所以如果我猜错了,希望你能想出如何调整答案以满足你的需要


解决这个问题的一种方法是通过将百分比加倍来避免您不希望Python处理的百分比:

cmd = "tshark -o column.format:'\"Source\", \"%%s\", \"Destination\", \"%%d\", \"dstport\", \"%%uD\"' -r %s |sort|uniq " %filepcap
如上的文档所述,说明符
%%
表示“未转换任何参数,结果中会出现
'%'
字符。”

如果您打印出结果(当您尝试调试这样的东西时总是应该打印!),您将看到
%s
已被
filepcap
值替换,但
%s
已变成
%s


但是,一个更简单的解决方案是只使用不同的格式化机制,而不需要
%
,例如:


有两件事可以让你的代码更容易编写、阅读和调试:(1)使用三重引号字符串,而不是转义引号;(2)让Python通过使用来为你做一些工作。有一件事可以让它更容易:如果你不需要shell,就不要使用它。请参见子流程文档中的。
cmd = "tshark -o column.format:'\"Source\", \"%s\", \"Destination\", \"%d\", \"dstport\", \"%uD\"' -r {} |sort|uniq ".format(filepcap)