Salut din nou! Sper sa fie ultima data cand va “supar” cu probleme legate de acest script, care este o urmare al acestui thread.
In scriptul de fata am urmarit sa lansez un program pe care sa-l monitorizeze atata vreme cat programul exista. Asadar, am ajuns in momentul in care am folosit un Timer care controleaza o bucla ce scrie unui fiser si afiseaza consolei valoarea unui atribut al unui proces lansat (in cazul de fata mspaint).
Problema este ca atunci cand apas CTRL + C in consola sau daca inchid mspaint, scriptul python preia aceste evenimente doar dupa ce timpul definit in interval s-a scurs, evenimente care determina oprirea scriptului.
Spre exemplu, daca este definit timpul de 20 de secunde pentru interval, iar odata ce scriptul este pornit, daca la secunda 5 apas fie CTRL + C in consola, fie inchid mspaint, scriptul python va fi oprit doar dupa ce au trecut cele 15 secunde ramase.
Ce mi-as fi dorit este ca scriptul python sa fie oprit imediat atunci cand folosesc CTRL + C sau cand inchid mspaint. Dupa cateva ore de cautare n-am ajuns la nicio solutie, din pacate.
Scriptul poate fi folosit cu urmatoarea comanda, potrivit exemplului:
python.exe mon_tool.py -c "C:\Windows\System32\mspaint.exe" -i 20
Am folosit:
Python: 3.10.4
psutil: 5.9.0
argparse: 1.1
Acesta este codul:
# mon_tool.py
import psutil, sys, os, argparse
from subprocess import Popen
from threading import Timer
def parse_args(args):
parser = argparse.ArgumentParser()
parser.add_argument("-c", "--cale", type=str, metavar=" ", required=True)
parser.add_argument("-i", "--interval", type=float, metavar=" ", required=True)
return parser.parse_args(args)
def validate(data):
if data.interval < 0:
raise ValueError(f"Timpul are o valoare negativa: {data.interval}. Te rog introdu o valoare pozitiva")
def main():
args = parse_args(sys.argv[1:])
validate(args)
try:
validate(args)
except ValueError as e:
print(f"Some invalid data -- {e}")
sys.exit(1)
# creeaza directorul Process monitor data in directorul Documents al
# prezentului profil Windows
default_path: str = f"{os.path.expanduser('~')}\\Documents\Process monitor data"
if not os.path.exists(default_path):
os.makedirs(default_path)
abs_path: str = f'{default_path}\data_test.txt'
print("Fisierul data_test.txt se afla in: " + default_path)
# lanseaza procesul provenit de la argumentul path, dupa care verfica daca
# a fost intr-adevar lansat
p: Popen[bytes] = Popen(args.cale)
PID = p.pid
isProcess: bool = True
while isProcess:
for proc in psutil.process_iter():
if(proc.pid == PID):
isProcess = False
process_stats = psutil.Process(PID)
# creeaza si apoi sterge continutul fisierului
with open(abs_path, 'w', newline='', encoding='utf-8') as testfile:
testfile.write("")
# bucla pentru a scrie numarul handle-urilor catre data_test.txt
# si pentru a afisa in consola acelasi numar
def process_monitor_loop():
with open(abs_path, 'a', newline='', encoding='utf-8') as testfile:
testfile.write(f"{process_stats.num_handles()}\n")
print(process_stats.num_handles())
Timer(args.interval, process_monitor_loop).start()
process_monitor_loop()
if __name__ == '__main__':
main()
Va multumesc!