ironpython獲取進程的磁盤io--通過調用c#的非託管代碼

由於ironpython本身沒有提供獲取磁盤io的api,所以要通過調用C#提供的api才行,C#也只能是通過非託管方式調用windows提供的api GetProcessIoCounters 來獲取磁盤的io

文件名:ProcIOCounter.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace ProcIOCounter
{
    public class kernel32
    {
        public struct IO_COUNTERS
        {
            public ulong ReadOperationCount;
            public ulong WriteOperationCount;
            public ulong OtherOperationCount;
            public ulong ReadTransferCount;
            public ulong WriteTransferCount;
            public ulong OtherTransferCount;
        }

        [DllImport("kernel32.dll")]
        public static extern bool GetProcessIoCounters(IntPtr ProcessHandle, out IO_COUNTERS IoCounters);
    }
}

將上面的C#文件編譯生成ProcIOCounter.dll ,並且將它放到ironpython所在的文件夾內

文件名:test.py 

from ProcIOCounter.kernel32 import IO_COUNTERS, GetProcessIoCounters
from System.Diagnostics.Process import GetCurrentProcess
def get_proc_iospeed(proc):
    handle = proc.Handle
    counter = clr.Reference[IO_COUNTERS]()  #這個結構體跟上面C#中定義的是對應的
    GetProcessIoCounters(handle,counter)
    return (counter.ReadTransferCount, counter.WriteTransferCount)

if __name__ == "__main__":
    proc = GetCurrentProcess()
    r,w = get_proc_iospeed(proc)
    print r
    print w

執行方式:ipy test.py

轉載請註明出處:http://blog.csdn.net/liujian0616/article/details/7951739


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章