写入文件,子进程。呼叫输出什么都不返回

时间:2013-06-02 18:14:02

标签: python linux subprocess

我有一个小代码,可以定期跟踪cpu使用情况。不知何故,当我尝试创建文件(“wb”或“w”模式)时,文件被创建但是它是空的。知道为什么会这样吗?

W / O文件处理程序:

import subprocess
import os

MESSAGE = "mpstat -P ALL | awk '{print $4}'"
SLEEP = "sleep 1"

cmds = [MESSAGE, SLEEP]


def runCommands(commands = cmds):
    count =0
    while True:
            for cmd in cmds:
                    count+=1
                    subprocess.call(cmd, shell = True)


runCommands()

使用文件处理程序:

import subprocess
import os

MESSAGE = "mpstat -P ALL | awk '{print $4}'"
SLEEP = "sleep 1"

cmds = [MESSAGE, SLEEP]


def runCommands(commands = cmds):
    count =0
    while True:
         for cmd in cmds:
            count+=1
            with open('cpu_usage.txt', 'w')as f:
                subprocess.call(cmd, stdout = f, shell = True)


runCommands()

mpstat给出标准输出(不是标准错误)。目标是使用python每秒收集CPU和内存使用量,并嵌入应用程序中以收集数据并以图形方式输出相同的数据。我知道psutil在这方面是一个很好的框架,但是如果你没有玩很多。它也可以解决我的问题,因为最终我有一个图形输出,每秒包含mem和cpu使用。

最终我正在寻找以下形式的输出:

      %CPU   %MEM 

      ..      ..
      ..      ..
      ..      ..

最后,CPU和时间与内存的时间足以满足需求。我抓住cpu值只是迈出这个问题的一步。 ps aux似乎不是一个很好的命令来做我需要的,虽然它给出的输出类似于我想要的输出。任何想法/想法/建议。

1 个答案:

答案 0 :(得分:1)

当您打开带有'w'参数的文件时,每次都会重新创建,这意味着当您的while循环结束时(在您的示例中不会,但我们假设它确实) - 使用该文件执行的最后一件事是sleep 1命令,它不打印任何内容。使用'a'(追加)标志打开文件,您将拥有所有mpstat输出。

请参阅http://docs.python.org/2/tutorial/inputoutput.html#reading-and-writing-files以获取完整参考。

但总的来说,尝试在Python中进行更多处理并减少对OS命令的依赖,如下所示(尽管我仍然没有完成AWK的东西,但无论如何)。

import subprocess
import os
import time

CPU = "mpstat -P ALL | awk 'NR==4 { print $3 }'"
MEM = "free -m | awk 'NR==3 { print $4 }'"

def runCommands():
    count = 0
    f = open('cpu_usage.txt', 'a')
    while True:
         t = str(int(time.time()))
         cpu = subprocess.check_output(CPU, shell = True).strip()
         mem = subprocess.check_output(MEM, shell = True).strip()

         f.write(' '.join([t, cpu, mem]))
         f.write('\n')
         f.flush()

         time.sleep(1)

runCommands()