Jaki jest Twój preferowany sposób uzyskania aktualnego stanu systemu (bieżący procesor, pamięć RAM, wolne miejsce na dysku itp.) W Pythonie? Punkty bonusowe dla platform * nix i Windows.
Wydaje się, że istnieje kilka możliwych sposobów wyodrębnienia tego z mojego wyszukiwania:
Korzystanie z biblioteki takiej jak PSI (która obecnie nie wydaje się aktywnie rozwijana i nie jest obsługiwana na wielu platformach) lub coś w rodzaju pystatgrab (znów brak aktywności od 2007 roku i brak obsługi systemu Windows).
Używanie kodu specyficznego dla platformy, np. Używanie a
os.popen("ps")
lub podobnego dla systemów * nix orazMEMORYSTATUS
wctypes.windll.kernel32
(patrz ten przepis na ActiveState ) dla platformy Windows. Można umieścić klasę Python razem z tymi wszystkimi fragmentami kodu.
Nie chodzi o to, że te metody są złe, ale czy istnieje już dobrze obsługiwany, wieloplatformowy sposób robienia tego samego?
Odpowiedzi:
Biblioteka psutil poda pewne informacje o systemie (użycie procesora / pamięci) na różnych platformach:
AKTUALIZACJA: Oto kilka przykładowych zastosowań
psutil
:źródło
$ pip install psutil
;>>> import psutil; psutil.cpu_percent()
i>>> psutil.virtual_memory()
który zwraca ładny obiekt vmem:vmem(total=8589934592L, available=4073336832L, percent=52.6, used=5022085120L, free=3560255488L, active=2817949696L, inactive=513081344L, wired=1691054080L)
Użyj biblioteki psutil . Na Ubuntu 18.04, pip zainstalował 5.5.0 (najnowsza wersja) od 1-30-2019. Starsze wersje mogą zachowywać się nieco inaczej. Możesz sprawdzić swoją wersję psutil, wykonując to w Pythonie:
Aby uzyskać statystyki pamięci i procesora:
virtual_memory
(Krotka) będzie pamięć procent stosowane w całym systemie. Wydawało mi się to być przecenione o kilka procent dla Ubuntu 18.04.Możesz także uzyskać pamięć używaną przez bieżącą instancję Pythona:
co daje bieżące wykorzystanie pamięci przez twój skrypt Python.
Istnieje kilka bardziej szczegółowych przykładów na stronie pypi dla psutil .
źródło
Tylko dla Linux: One-liner do wykorzystania pamięci RAM z tylko zależnością stdlib:
edycja: określona zależność systemu operacyjnego od rozwiązania
źródło
os.popen('free -th').readlines()[-1].split()[1:]
. Zauważ, że ta linia zwraca listę ciągów.python:3.8-slim-buster
Nie mafree
Poniższe kody, bez bibliotek zewnętrznych działały dla mnie. Testowałem w Pythonie 2.7.9
Użycie procesora
I wykorzystanie pamięci RAM, całkowite, używane i bezpłatne
źródło
grep
iawk
lepiej byłoby załatwione przez ciąg przetwarzania w Pythonie?Oto coś, co przygotowałem jakiś czas temu, są to tylko okna, ale mogą pomóc ci uzyskać część tego, co musisz zrobić.
Pochodzi z: „for sys available mem” http://msdn2.microsoft.com/en-us/library/aa455130.aspx
„informacje o poszczególnych procesach i przykłady skryptów w języku Python” http://www.microsoft.com/technet/scriptcenter/scripts/default.mspx?mfr=true
UWAGA: interfejs / proces WMI jest również dostępny do wykonywania podobnych zadań, nie używam go tutaj, ponieważ obecna metoda pokrywa moje potrzeby, ale jeśli pewnego dnia konieczne będzie jego rozszerzenie lub ulepszenie, może warto sprawdzić dostępne narzędzia WMI .
WMI dla python:
http://tgolden.sc.sabren.com/python/wmi.html
Kod:
http://monkut.webfactional.com/blog/archive/2009/1/21/windows-process-memory-logging-python
źródło
from x import *
stwierdzeń! Zaśmiecają główną przestrzeń nazw i zastępują inne funkcje i zmienne.Zdecydowaliśmy się użyć do tego zwykłego źródła informacji, ponieważ mogliśmy znaleźć chwilowe wahania wolnej pamięci i uważaliśmy, że zapytanie źródła danych meminfo było pomocne. Pomogło nam to również uzyskać kilka innych powiązanych parametrów, które zostały wstępnie przeanalizowane.
Kod
Wynik w celach informacyjnych (usunęliśmy wszystkie nowe wiersze do dalszej analizy)
źródło
resource
Wydaje mi się, że te odpowiedzi zostały napisane dla Pythona 2, aw każdym razie nikt nie wspomniał o standardowym pakiecie, który jest dostępny dla Pythona 3. Udostępnia on komendy pozwalające uzyskać limity zasobów danego procesu (domyślnie wywołujący proces Pythona). Nie jest to równoznaczne z uzyskaniem bieżącego wykorzystania zasobów przez system jako całości, ale może rozwiązać niektóre z tych samych problemów, np. „Chcę się upewnić, że używam X dużo pamięci RAM w tym skrypcie”.źródło
„... aktualny stan systemu (bieżący procesor, pamięć RAM, wolne miejsce na dysku itp.)” „Platformy„ nix i Windows ”mogą być trudne do osiągnięcia.
Systemy operacyjne różnią się zasadniczo pod względem sposobu zarządzania tymi zasobami. Rzeczywiście różnią się one w podstawowych pojęciach, takich jak definiowanie tego, co liczy się jako system, a co czasu aplikacji.
"Wolne miejsce na dysku"? Co liczy się jako „miejsce na dysku?” Wszystkie partycje wszystkich urządzeń? Co z zagranicznymi partycjami w środowisku z wieloma systemami?
Nie sądzę, aby istniał wystarczająco wyraźny konsensus między Windows i * nix, który to umożliwi. Rzeczywiście, różne systemy operacyjne o nazwie Windows mogą nawet nie być zgodne. Czy istnieje jeden interfejs API systemu Windows, który działa zarówno w systemie XP, jak i Vista?
źródło
df -h
odpowiada na pytanie dotyczące „miejsca na dysku” zarówno w systemie Windows, jak i * nix.Ten skrypt do użycia procesora:
źródło
Aby uzyskać szczegółowe informacje na temat procesora, użyj biblioteki psutil
W przypadku częstotliwości RAM (w MHz) użyj wbudowanego kodu dmidecode biblioteki Linuxa i nieco zmodyfikuj dane wyjściowe;). to polecenie wymaga uprawnień administratora, dlatego też podaj swoje hasło. po prostu skopiuj następujące polecenie zastępując mypass hasłem
[i for i in os.popen("echo mypass | sudo -S dmidecode -t memory | grep 'Clock Speed' | cut -d ':' -f2").read().split(' ') if i.isdigit()]
źródło
Aby uzyskać dostęp do pamięci po linii i analizę czasu twojego programu, sugeruję użycie
memory_profiler
iline_profiler
.Instalacja:
Wspólne jest to, że za pomocą odpowiednich dekoratorów określasz funkcję, którą chcesz analizować.
Przykład: Mam kilka funkcji w pliku Pythona,
main.py
które chcę przeanalizować. Jednym z nich jestlinearRegressionfit()
. Muszę użyć dekoratora,@profile
który pomaga mi profilować kod w odniesieniu do: Czasu i pamięci.Wprowadź następujące zmiany w definicji funkcji
Do czasu profilowania ,
Biegać:
Wynik
Do profilowania pamięci ,
Biegać:
Wynik
Wyniki profilera pamięci można również wykreślić przy
matplotlib
użyciuUwaga: Testowano na
line_profiler
wersja == 3.0.2memory_profiler
wersja == 0,57.0psutil
wersja == 5.7.0źródło
Możesz użyć psutil lub psmem z przykładowym kodem podprocesu
Odniesienie http://techarena51.com/index.php/how-to-install-python-3-and-flask-on-linux/
https://github.com/Leo-g/python-flask-cmd
źródło
W oparciu o kod użycia procesora @Hrabal używam:
źródło
Nie sądzę, aby dostępna była dobrze obsługiwana biblioteka wieloplatformowa. Pamiętaj, że sam Python jest napisany w C, więc każda biblioteka po prostu podejmie mądrą decyzję o tym, który fragment kodu specyficzny dla systemu operacyjnego ma zostać uruchomiony, jak zasugerowałeś powyżej.
źródło