将参数传递给bash时子进程会混淆

将参数传递给bash时子进程会混淆

问题描述:

实际上,我试图将下面的代码传递给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

你说得对。 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