파이썬에서 현재 시스템 상태 (현재 CPU, RAM, 여유 디스크 공간 등)를 얻는 가장 좋은 방법은 무엇입니까? * nix 및 Windows 플랫폼의 보너스 포인트.
내 검색에서 추출하는 몇 가지 가능한 방법이 있습니다.
-
PSI 와 같은 라이브러리 (현재 활발하게 개발되지 않았고 여러 플랫폼에서 지원되지 않는 것으로 보임) 또는 pystatgrab (2007 년 이후 활동이 없으며 Windows를 지원하지 않는 것)과 같은 라이브러리를 사용 합니다.
-
이러한 사용으로 플랫폼 특정 코드를 사용
os.popen("ps")
* 괜찬아 시스템 및 또는 유사한MEMORYSTATUS
에서ctypes.windll.kernel32
(볼 은 ActiveState에이 제조법 Windows 플랫폼을위한 참조). 파이썬 클래스를 모든 코드 스 니펫과 함께 넣을 수 있습니다.
이러한 방법이 나쁘지는 않지만 동일한 작업을 수행하는 잘 지원되는 다중 플랫폼 방법이 있습니까?
답변
psutil 라이브러리 는 다양한 플랫폼에서 CPU, RAM 등에 대한 정보를 제공합니다.
psutil은 ps, top 및 Windows 작업 관리자와 같은 도구가 제공하는 많은 기능을 구현하여 Python을 사용하여 휴대용 방식으로 프로세스 및 시스템 활용 (CPU, 메모리) 실행 정보를 검색하기위한 인터페이스를 제공하는 모듈입니다.
현재 2.6 ~ 3.5의 Python 버전 (Python 2.4 및 2.5의 사용자는 2.1.3 버전을 사용할 수 있음)과 함께 Linux, Windows, OSX, Sun Solaris, FreeBSD, OpenBSD 및 NetBSD (32 비트 및 64 비트 아키텍처)를 지원합니다.
몇 가지 예 :
#!/usr/bin/env python
import psutil
# gives a single float value
psutil.cpu_percent()
# gives an object with many fields
psutil.virtual_memory()
# you can convert that object to a dictionary
dict(psutil.virtual_memory()._asdict())
# you can have the percentage of used RAM
psutil.virtual_memory().percent
79.2
# you can calculate percentage of available memory
psutil.virtual_memory().available * 100 / psutil.virtual_memory().total
20.8
더 많은 개념과 관심 개념을 제공하는 다른 문서는 다음과 같습니다.
답변
psutil 라이브러리를 사용하십시오 . Ubuntu 18.04에서 pip는 2019 년 1 월 30 일부터 5.5.0 (최신 버전)을 설치했습니다. 이전 버전은 약간 다르게 동작 할 수 있습니다. Python에서 다음을 수행하여 psutil 버전을 확인할 수 있습니다.
from __future__ import print_function # for Python2
import psutil
print(psutil.__version__)
메모리 및 CPU 통계를 얻으려면 :
from __future__ import print_function
import psutil
print(psutil.cpu_percent())
print(psutil.virtual_memory()) # physical memory usage
print('memory % used:', psutil.virtual_memory()[2])
virtual_memory
(튜플) 비율 메모리가 시스템 전체를 사용해야합니다. 이것은 우분투 18.04에서 몇 퍼센트 정도 과대 평가 된 것으로 보입니다.
현재 Python 인스턴스에서 사용하는 메모리를 얻을 수도 있습니다.
import os
import psutil
pid = os.getpid()
py = psutil.Process(pid)
memoryUse = py.memory_info()[0]/2.**30 # memory use in GB...I think
print('memory use:', memoryUse)
파이썬 스크립트의 현재 메모리 사용을 제공합니다.
답변
Linux 만 해당 : stdlib 종속성 만있는 RAM 사용을위한 1 개의 라이너 :
import os
tot_m, used_m, free_m = map(int, os.popen('free -t -m').readlines()[-1].split()[1:])
편집 : 지정된 솔루션 OS 종속성
답변
외부 라이브러리가없는 아래 코드는 나를 위해 일했습니다. 파이썬 2.7.9에서 테스트했습니다.
CPU 사용량
import os
CPU_Pct=str(round(float(os.popen('''grep 'cpu ' /proc/stat | awk '{usage=($2+$4)*100/($2+$4+$5)} END {print usage }' ''').readline()),2))
#print results
print("CPU Usage = " + CPU_Pct)
그리고 Ram 사용량, 총계, 사용 및 무료
import os
mem=str(os.popen('free -t -m').readlines())
"""
Get a whole line of memory output, it will be something like below
[' total used free shared buffers cached\n',
'Mem: 925 591 334 14 30 355\n',
'-/+ buffers/cache: 205 719\n',
'Swap: 99 0 99\n',
'Total: 1025 591 434\n']
So, we need total memory, usage and free memory.
We should find the index of capital T which is unique at this string
"""
T_ind=mem.index('T')
"""
Than, we can recreate the string with this information. After T we have,
"Total: " which has 14 characters, so we can start from index of T +14
and last 4 characters are also not necessary.
We can create a new sub-string using this information
"""
mem_G=mem[T_ind+14:-4]
"""
The result will be like
1025 603 422
we need to find first index of the first space, and we can start our substring
from from 0 to this index number, this will give us the string of total memory
"""
S1_ind=mem_G.index(' ')
mem_T=mem_G[0:S1_ind]
"""
Similarly we will create a new sub-string, which will start at the second value.
The resulting string will be like
603 422
Again, we should find the index of first space and than the
take the Used Memory and Free memory.
"""
mem_G1=mem_G[S1_ind+8:]
S2_ind=mem_G1.index(' ')
mem_U=mem_G1[0:S2_ind]
mem_F=mem_G1[S2_ind+8:]
print 'Summary = ' + mem_G
print 'Total Memory = ' + mem_T +' MB'
print 'Used Memory = ' + mem_U +' MB'
print 'Free Memory = ' + mem_F +' MB'
답변
여기 제가 얼마 전에 정리 한 것이 있습니다. 창문 일 뿐이지 만 필요한 일에 참여하는 데 도움이 될 수 있습니다.
“sys available mem”에서 파생 됨 :
http://msdn2.microsoft.com/en-us/library/aa455130.aspx
“개별 프로세스 정보 및 Python 스크립트 예”
http://www.microsoft.com/technet/scriptcenter/scripts/default.mspx?mfr=true
참고 : WMI 인터페이스 / 프로세스도 비슷한 작업을 수행 할 수 있습니다. 현재 방법이 내 요구를 충족시키기 때문에 여기에서 사용하지 않지만 언젠가 이것을 확장하거나 개선 해야하는 경우 WMI 도구를 조사 할 수 있습니다 .
파이썬 WMI :
http://tgolden.sc.sabren.com/python/wmi.html
코드:
'''
Monitor window processes
derived from:
>for sys available mem
http://msdn2.microsoft.com/en-us/library/aa455130.aspx
> individual process information and python script examples
http://www.microsoft.com/technet/scriptcenter/scripts/default.mspx?mfr=true
NOTE: the WMI interface/process is also available for performing similar tasks
I'm not using it here because the current method covers my needs, but if someday it's needed
to extend or improve this module, then may want to investigate the WMI tools available.
WMI for python:
http://tgolden.sc.sabren.com/python/wmi.html
'''
__revision__ = 3
import win32com.client
from ctypes import *
from ctypes.wintypes import *
import pythoncom
import pywintypes
import datetime
class MEMORYSTATUS(Structure):
_fields_ = [
('dwLength', DWORD),
('dwMemoryLoad', DWORD),
('dwTotalPhys', DWORD),
('dwAvailPhys', DWORD),
('dwTotalPageFile', DWORD),
('dwAvailPageFile', DWORD),
('dwTotalVirtual', DWORD),
('dwAvailVirtual', DWORD),
]
def winmem():
x = MEMORYSTATUS() # create the structure
windll.kernel32.GlobalMemoryStatus(byref(x)) # from cytypes.wintypes
return x
class process_stats:
'''process_stats is able to provide counters of (all?) the items available in perfmon.
Refer to the self.supported_types keys for the currently supported 'Performance Objects'
To add logging support for other data you can derive the necessary data from perfmon:
---------
perfmon can be run from windows 'run' menu by entering 'perfmon' and enter.
Clicking on the '+' will open the 'add counters' menu,
From the 'Add Counters' dialog, the 'Performance object' is the self.support_types key.
--> Where spaces are removed and symbols are entered as text (Ex. # == Number, % == Percent)
For the items you wish to log add the proper attribute name in the list in the self.supported_types dictionary,
keyed by the 'Performance Object' name as mentioned above.
---------
NOTE: The 'NETFramework_NETCLRMemory' key does not seem to log dotnet 2.0 properly.
Initially the python implementation was derived from:
http://www.microsoft.com/technet/scriptcenter/scripts/default.mspx?mfr=true
'''
def __init__(self,process_name_list=[],perf_object_list=[],filter_list=[]):
'''process_names_list == the list of all processes to log (if empty log all)
perf_object_list == list of process counters to log
filter_list == list of text to filter
print_results == boolean, output to stdout
'''
pythoncom.CoInitialize() # Needed when run by the same process in a thread
self.process_name_list = process_name_list
self.perf_object_list = perf_object_list
self.filter_list = filter_list
self.win32_perf_base = 'Win32_PerfFormattedData_'
# Define new datatypes here!
self.supported_types = {
'NETFramework_NETCLRMemory': [
'Name',
'NumberTotalCommittedBytes',
'NumberTotalReservedBytes',
'NumberInducedGC',
'NumberGen0Collections',
'NumberGen1Collections',
'NumberGen2Collections',
'PromotedMemoryFromGen0',
'PromotedMemoryFromGen1',
'PercentTimeInGC',
'LargeObjectHeapSize'
],
'PerfProc_Process': [
'Name',
'PrivateBytes',
'ElapsedTime',
'IDProcess',# pid
'Caption',
'CreatingProcessID',
'Description',
'IODataBytesPersec',
'IODataOperationsPersec',
'IOOtherBytesPersec',
'IOOtherOperationsPersec',
'IOReadBytesPersec',
'IOReadOperationsPersec',
'IOWriteBytesPersec',
'IOWriteOperationsPersec'
]
}
def get_pid_stats(self, pid):
this_proc_dict = {}
pythoncom.CoInitialize() # Needed when run by the same process in a thread
if not self.perf_object_list:
perf_object_list = self.supported_types.keys()
for counter_type in perf_object_list:
strComputer = "."
objWMIService = win32com.client.Dispatch("WbemScripting.SWbemLocator")
objSWbemServices = objWMIService.ConnectServer(strComputer,"root\cimv2")
query_str = '''Select * from %s%s''' % (self.win32_perf_base,counter_type)
colItems = objSWbemServices.ExecQuery(query_str) # "Select * from Win32_PerfFormattedData_PerfProc_Process")# changed from Win32_Thread
if len(colItems) > 0:
for objItem in colItems:
if hasattr(objItem, 'IDProcess') and pid == objItem.IDProcess:
for attribute in self.supported_types[counter_type]:
eval_str = 'objItem.%s' % (attribute)
this_proc_dict[attribute] = eval(eval_str)
this_proc_dict['TimeStamp'] = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.') + str(datetime.datetime.now().microsecond)[:3]
break
return this_proc_dict
def get_stats(self):
'''
Show process stats for all processes in given list, if none given return all processes
If filter list is defined return only the items that match or contained in the list
Returns a list of result dictionaries
'''
pythoncom.CoInitialize() # Needed when run by the same process in a thread
proc_results_list = []
if not self.perf_object_list:
perf_object_list = self.supported_types.keys()
for counter_type in perf_object_list:
strComputer = "."
objWMIService = win32com.client.Dispatch("WbemScripting.SWbemLocator")
objSWbemServices = objWMIService.ConnectServer(strComputer,"root\cimv2")
query_str = '''Select * from %s%s''' % (self.win32_perf_base,counter_type)
colItems = objSWbemServices.ExecQuery(query_str) # "Select * from Win32_PerfFormattedData_PerfProc_Process")# changed from Win32_Thread
try:
if len(colItems) > 0:
for objItem in colItems:
found_flag = False
this_proc_dict = {}
if not self.process_name_list:
found_flag = True
else:
# Check if process name is in the process name list, allow print if it is
for proc_name in self.process_name_list:
obj_name = objItem.Name
if proc_name.lower() in obj_name.lower(): # will log if contains name
found_flag = True
break
if found_flag:
for attribute in self.supported_types[counter_type]:
eval_str = 'objItem.%s' % (attribute)
this_proc_dict[attribute] = eval(eval_str)
this_proc_dict['TimeStamp'] = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.') + str(datetime.datetime.now().microsecond)[:3]
proc_results_list.append(this_proc_dict)
except pywintypes.com_error, err_msg:
# Ignore and continue (proc_mem_logger calls this function once per second)
continue
return proc_results_list
def get_sys_stats():
''' Returns a dictionary of the system stats'''
pythoncom.CoInitialize() # Needed when run by the same process in a thread
x = winmem()
sys_dict = {
'dwAvailPhys': x.dwAvailPhys,
'dwAvailVirtual':x.dwAvailVirtual
}
return sys_dict
if __name__ == '__main__':
# This area used for testing only
sys_dict = get_sys_stats()
stats_processor = process_stats(process_name_list=['process2watch'],perf_object_list=[],filter_list=[])
proc_results = stats_processor.get_stats()
for result_dict in proc_results:
print result_dict
import os
this_pid = os.getpid()
this_proc_results = stats_processor.get_pid_stats(this_pid)
print 'this proc results:'
print this_proc_results
http://monkut.webfactional.com/blog/archive/2009/1/21/windows-process-memory-logging-python
답변
우리는 여유 메모리에서 순간적인 변동을 발견 할 수 있고 meminfo 데이터 소스를 쿼리하는 것이 도움이되었다고 느꼈기 때문에 일반적인 정보 소스를 사용하기로 선택했습니다 . 또한 사전 분석 된 몇 가지 관련 매개 변수를 얻는 데 도움이되었습니다.
암호
import os
linux_filepath = "/proc/meminfo"
meminfo = dict(
(i.split()[0].rstrip(":"), int(i.split()[1]))
for i in open(linux_filepath).readlines()
)
meminfo["memory_total_gb"] = meminfo["MemTotal"] / (2 ** 20)
meminfo["memory_free_gb"] = meminfo["MemFree"] / (2 ** 20)
meminfo["memory_available_gb"] = meminfo["MemAvailable"] / (2 ** 20)
참조 출력 (추가 분석을 위해 모든 줄 바꿈 제거)
MemTotal : 1014500 kB MemFree : 562680 kB 사용 가능 : 646364 kB 버퍼 : 15144 kB 캐시 됨 : 210720 kB 스왑 캐시 : 0 kB 활성 : 261476 kB 비활성 : 128888 kB 활성 (anon) : 167092 kB 비활성 (anon) : 20888 kB 활성 (파일) : 94384 kB 비활성 (파일) : 108000 kB 제거 불가 : 3652 kB Mlocked : 3652 kB SwapTotal : 0 kB SwapFree : 0 kB Dirty : 0 kB Writeback : 0 kB AnonPages : 168160 kB 매핑 됨 : 81352 kB Shmem : 21060 kB 슬래브 : 34492 kB Sreclaimable : 18044 kB SUnreclaim : 16448 kB KernelStack : 2672 kB PageTables : 8180 kB NFS_Unstable : 0 kB Bounce : 0 kB WritebackTmp : 0 kB CommitLimit : 507248 kB Committed_AS : 1038756 kB VmallocTotal : 34359738367 kB Vumloc 사용 : 하드웨어 : 0 kB AnonHuge 페이지 : 88064 kB CmaTotal : 0 kB CmaFree : 0 kB HugePages_Total : 0 HugePages_Free : 0 HugePages_Rsvd : 0 HugePages_Surp : 0 Hugepages 크기 :2048 kB DirectMap4k : 43008 kB DirectMap2M : 1005568 kB
답변
이 답변은 Python 2 용으로 작성된 것 같으며 어떤 경우에도 resource
Python 3에서 사용할 수 있는 표준 패키지에 대해 언급 한 사람이 없습니다 . 주어진 프로세스 (기본적으로 Python 프로세스 호출) 의 리소스 제한 을 얻는 명령을 제공합니다 . 이것은 시스템이 전체 리소스를 현재 사용 하는 것과 동일하지 않지만 “이 스크립트에는 X 개의 RAM 만 사용하고 싶습니다”와 같은 동일한 문제를 해결할 수 있습니다.