0

我有一个长命令保存在一个文件中。
我还有一个输入文件列表,我想将其传递给同一个命令,
所以我%s在两个地方都有一个说明符。

$ 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

这似乎不对。出于好奇,我放入了一个输入文件,并尝试从 shell 运行它

$ /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.txt。您在 Python REPL 中的代码正在向bash(或您正在使用的任何 shell)发送类似以下内容:

/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

第一行末尾的分号结束命令,因此 shell 仅在其time上运行rm

一种可能的解决方法是将您的命令块包装在一个中。这样,time在整个组中运行。

或者,您可以使用位置参数。您可以将命令%s中的符号替换为,它解释为第一个命令行参数。然后,您可以作为 shell 脚本运行,将要使用的值作为命令行参数传递,例如: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 http://docs.python.org/library/subprocess.html

在执行之前打印命令并在 shell 中尝试。

您可以使用以下方法检查时间:

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