将参数传递给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)
你能帮我解决吗?
谢谢。
答
你说得对。 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
两件事情,这将使你的代码更容易写,读,并调试:(1)使用三引号字符串而不是转义引号,(2)让Python使用['shlex.quote']为你做一些工作(http://docs.python.org/ 3.3 /库/ shlex.html#shlex.quote)。 – abarnert
有一件事会让它更容易:如果你不需要的话,不要使用shell。请参阅子流程文档中的[替换外壳管道](http://docs.python.org/3.3/library/subprocess.html#replacing-shell-pipeline)。 – abarnert