子进程在向bash传递参数时会混淆

2024-10-04 11:27:44 发布

您现在位置:Python中文网/ 问答频道 /正文

实际上,我正在尝试将下面的代码传递给bash。但我认为%s的tshark和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)

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

谢谢。你知道吗


Tags: 字符串代码selfcmdbash参数portdef
1条回答
网友
1楼 · 发布于 2024-10-04 11:27:44

你的猜测是对的。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

^{}-style String Formatting文档中所述,说明符%%表示“不转换任何参数,结果是结果中的'%'字符。”

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


然而,一个更简单的解决方案是使用不同的格式化机制,它不需要%,比如^{}

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

相关问题 更多 >