0

実際、私は以下のコードを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)

これについて私を助けてもらえますか?

ありがとう。

4

1 に答える 1

0

あなたの推測は正しいです。Python の演算子は、文字列内の指定子の一部だけでなく、すべて%の指定子を置き換えようとします。4 つの指定子と 1 つの値しか見つからないため、 と表示されます。 %%TypeError: not enough arguments for format string

しかし、そうでなかったとしても、4 つのうちどれを置き換えたいかをどのように推測できると思いましたか? 私は人間であり、私でさえ推測に苦労しています.


これを回避する 1 つの方法は、Python に処理させたくないパーセントを 2 倍にしてエスケープすることです。

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 に答える