0

ファイルに保存された長いコマンドがあります。
また、この同じコマンドに渡したい入力ファイルのリストもある
ため、%s指定子が 2 か所あります。

$ cat https-tcp-session.txt

rm -f /tmp/A.raw /tmp/B.raw /tmp/result.raw; \
rwfilter --sport=443 --proto=6 --pass=stdout %s | \
rwsort --fields=sIP,dIP | \
rwgroup --id-fields=sIP,dIP --summarize | \
rwfilter --input-pipe=stdin --pass=/tmp/A.raw --packets=200-; \
rwfilter --dport=443 --proto=6 --pass=stdout %s | \
rwsort --fields=sIP,dIP | \
rwgroup --id-fields=sIP,dIP --summarize | \
rwfilter --input-pipe=stdin --pass=/tmp/B.raw --packets=200-; \
rwmatch --relate=1,2 --relate=2,1 \
/tmp/A.raw /tmp/B.raw /tmp/result.raw;

次に、python REPL で試してみます。

>>> cmd = open('https-tcp-session.txt').read()
>>> cmd = cmd.replace('%s', 'trace.rwf.gz')
>>> time = '/usr/bin/time -f "%e"'
>>> stmt = '%s %s'%(time, cmd)
>>> os.system(stmt)
0.01 
0

それは正しくないようです。好奇心のために、入力ファイルを入れて、シェルから実行しようとしました

$ /usr/bin/time -f "%e" bash https-tcp-session.txt
17.73

ブロックの最初のコマンドのタイミングだけが時間のように感じます(rm)

4

3 に答える 3

1

最も簡単な方法:

import time
startTime = time.time()
# Do something
elapsed = time.time() - startTime
print("Elapsed time: %.3f" % elapsed)

ベンチマーク目的でタイミング関数を実行する場合は、プログラム/コマンドを複数回実行して平均を取ることをお勧めします。そう:

import time
elapsed = []
for i in range(NUMBER_OF_TRIALS):
    startTime = time.time()
    # Do something
    elapsed.append(time.time() - startTime)
print("Average elapsed time: %.3f" % (sum(elapsed) / float(len(elapsed))))
于 2012-06-23T21:30:21.300 に答える
1

ご想像のとおり、ファイルtimeの最初のコマンドだけを実行しているようです。https-tcp-session.txtPython REPL のコードは、次のようなものをbash(または使用しているシェルに)送信しています。

/usr/bin/time -f "%e" rm -f /tmp/A.raw /tmp/B.raw /tmp/result.raw; \
rwfilter --sport=443 --proto=6 --pass=stdout %s | \
rwsort --fields=sIP,dIP | \
# rest omitted

最初の行の最後のセミコロンはコマンドを終了するため、シェルはtimeonrmのみで実行されます。

考えられる修正の 1 つは、コマンドのブロックをgroupでラップすることです。そうtimeすれば、グループ全体で実行されます。

または、位置パラメータを使用することもできます。コマンド内の%s記号を、最初のコマンドライン引数として解釈されるに置き換えることができます。その後、コマンド ライン引数として使用する値を渡して、シェル スクリプトとして実行できます。次に例を示します。https-tcp-session.txt$1bashhttps-tcp-session.txt$1

$ bash https-tcp-session.txt trace.rwf.gz

(どちらのアプローチもテストしていないことに注意してください。)

于 2012-06-23T21:53:27.993 に答える
0

常に bash コマンドからの戻り値を確認してください。0 である必要があります。os.system の代わりに subprocess モジュールを使用してくださいhttp://docs.python.org/library/subprocess.html

実行する前にコマンドを出力し、シェルで試してください。

次を使用してタイミングを確認できます。

>>> a = datetime.datetime.now()
>>> some crazy comands
>>> b = datetime.datetime.now()
>>> c = b - a
于 2012-06-23T21:03:41.157 に答える