如何将一系列命令组合起来作为一个单元来计时?

2024-09-29 21:56:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我在文件中保存了一个长命令。
我还有一个输入文件的列表,我想将其传递给同一个命令,
所以我在两个地方有一个%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上尝试它。在

^{pr2}$

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

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

我有一种感觉时间只是计时第一个命令在街区(rm)


Tags: 文件rmhttps命令txtfieldsrawsession
3条回答

正如您可能怀疑的那样,似乎您只对https-tcp-session.txt文件中的第一个命令运行time。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只在rm上运行time。在

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

或者,您可以使用positional parameters。您可以将https-tcp-session.txt命令中的%s符号替换为$1,该bash将其解释为第一个命令行参数。然后可以将https-tcp-session.txt作为shell脚本运行,传递要在$1中使用的值作为命令行参数,例如:

^{2}$

(请注意,我没有测试这两种方法。)

总是检查bash命令的返回值,它应该是0。 使用子流程模块代替操作系统http://docs.python.org/library/subprocess.html

在命令执行之前先在shell中尝试。在

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

>>> a = datetime.datetime.now()
>>> some crazy comands
>>> b = datetime.datetime.now()
>>> c = b - a

最简单的方法:

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

在为基准测试运行计时函数时,最好多次运行程序/命令并取平均值。所以:

^{2}$

相关问题 更多 >

    热门问题