-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpyton_packages_upd.py
More file actions
118 lines (97 loc) · 4.6 KB
/
pyton_packages_upd.py
File metadata and controls
118 lines (97 loc) · 4.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
import subprocess
import sys
import json
from datetime import datetime, timedelta
import os
class PackageAutoUpdater:
def __init__(self, update_interval_days=7, silent=False):
"""
update_interval_days: Колко дни между проверки (по подразбиране 7)
silent: Ако е True, не показва съобщения (работи на заден план)
"""
self.update_interval = update_interval_days
self.silent = silent
self.check_file = ".last_package_check"
def should_check_updates(self):
"""Проверява дали е време за обновяване"""
if not os.path.exists(self.check_file):
return True
try:
with open(self.check_file, 'r') as f:
last_check = datetime.fromisoformat(f.read().strip())
days_passed = (datetime.now() - last_check).days
return days_passed >= self.update_interval
except:
return True
def update_check_time(self):
"""Записва времето на последната проверка"""
with open(self.check_file, 'w') as f:
f.write(datetime.now().isoformat())
def log(self, message):
"""Показва съобщение, ако не е в тих режим"""
if not self.silent:
print(message)
def get_outdated_packages(self):
"""Връща списък с остарели пакети"""
try:
result = subprocess.run(
[sys.executable, "-m", "pip", "list", "--outdated", "--format=json"],
capture_output=True,
text=True,
check=True,
timeout=30
)
outdated = json.loads(result.stdout)
return [pkg['name'] for pkg in outdated]
except:
return []
def update_packages(self):
"""Обновява всички остарели пакети"""
self.log("🔍 Проверка за обновления на пакети...")
outdated = self.get_outdated_packages()
if not outdated:
self.log("✓ Всички пакети са актуални")
self.update_check_time()
return
self.log(f"📦 Намерени {len(outdated)} пакета за обновяване")
for package in outdated:
try:
self.log(f" ⟳ Обновяване на {package}...")
subprocess.run(
[sys.executable, "-m", "pip", "install", "--upgrade", package, "--quiet"],
capture_output=True,
check=True,
timeout=120
)
self.log(f" ✓ {package} обновен")
except:
self.log(f" ✗ Грешка при {package}")
self.log("✓ Обновяването завърши")
self.update_check_time()
def check_and_update(self):
"""Основна функция - проверява и обновява ако е необходимо"""
if self.should_check_updates():
self.update_packages()
# ЛЕСЕН НАЧИН ЗА ИЗПОЛЗВАНЕ
def auto_update_packages(check_every_days=7, silent=False):
"""
Добави тази функция в началото на твоя код
Параметри:
- check_every_days: На всеки колко дни да проверява (по подразбиране 7)
- silent: True = тих режим без съобщения
"""
updater = PackageAutoUpdater(update_interval_days=check_every_days, silent=silent)
updater.check_and_update()
# ============================================
# ПРИМЕР ЗА ИЗПОЛЗВАНЕ В ТВОЯ КОД
# ============================================
if __name__ == "__main__":
# Добави това в началото на твоя main код
auto_update_packages(check_every_days=7, silent=False)
# Тук продължава твоя основен код
print("\n" + "="*50)
print("СТАРТИРАНЕ НА ОСНОВНИЯ КОД")
print("="*50)
# Твоя код тук...
print("Твоята програма работи...")
print("Обновяването на пакетите се случи автоматично!")