有什么方法可以使用python将终端命令的输出存储到文件中?

时间:2019-06-05 07:15:05

标签: python file terminal

我想使用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的唯一方法} 该过程不断运行,并且数据不断写入文件中,这并不理想,就像人们可能会猜到的那样

为清楚起见:我知道如何将输出写入文件,我只想在一段时间后停止写入

2 个答案:

答案 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?