我想使用Python将终端命令top
的输出存储到文件中。
在终端中,当我键入top
并按Enter键时,我得到的是实时输出,因此它会不断更新。我想将其存储到文件中固定的时间,然后停止写入。
file=open("data.txt","w")
file.flush()
import os,time
os.system("top>>data.txt -n 1")
time.sleep(5)
exit()
file.close()
我尝试先使用time.sleep()
,然后再使用exit()
,但是它不起作用,只能在终端机上通过{{1}来停止top
的唯一方法}
该过程不断运行,并且数据不断写入文件中,这并不理想,就像人们可能会猜到的那样
为清楚起见:我知道如何将输出写入文件,我只想在一段时间后停止写入
答案 0 :(得分:2)
system
将等待子进程的结束。如果您不希望这样做,Pythonic的方法是直接使用子流程模块:
import subprocess
timeout=60 # let top run for one minute
file=open("data.txt","w")
top = subprocess.Popen(["top", "-n", 1], stdout=file)
if top.wait(timeout) is None: # wait at most timeout seconds
top.terminate() # and terminate child
人为方法(强烈建议使用健壮的代码)将使用top
的完整路径。我不在这里,因为它可能取决于实际系统...
答案 1 :(得分:0)
您可能面临的问题是os.system作为当前进程的一部分启动该进程。因此,在您运行的命令完成执行之前,脚本的其余部分将不会运行。
我认为您想要做的是在另一个线程上执行控制台命令,以便当您的python脚本在后台运行时,可以继续运行python脚本的线程。有关更多信息,请参见run a python program on a new thread。
我建议使用类似的东西(未经测试):
import os
import time
import multiprocessing
myThread = multiprocessing.process(target=os.system, args=("top>>data.txt -n 1",))
myThread.start()
time.sleep(5)
myThread.terminate()
话虽如此,您可能需要考虑os.system()的线程安全性,如果它不是线程安全的,则需要找到一个替代方法。
还有一点值得注意(我对此知之甚少)是,以这种方式终止线程可能不是理想的选择,请参见此处的一些答案:Is there any way to kill a Thread?