Π‘ΡΠΊΠΎΠ½ΠΎΠΌΡŒΡ‚Π΅ 15% Π½Π° всСх хостинговых услугах

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ свои Π½Π°Π²Ρ‹ΠΊΠΈ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ скидку Π½Π° любой Ρ‚Π°Ρ€ΠΈΡ„Π½Ρ‹ΠΉ ΠΏΠ»Π°Π½

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΊΠΎΠ΄: Skills ΠΠ°Ρ‡Π°Ρ‚ΡŒ
Π ΡƒΠ±Ρ€ΠΈΠΊΠΈ
Linux VPS

Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΉ Π² Python: ΠΏΠΎΠ»Π½ΠΎΠ΅ руководство для VPS ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΉ

Π­Ρ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ΅ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°ΠΌΠΈ β€” это Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ Π½Π°Π²Ρ‹ΠΊ для любого Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° ΠΈΠ»ΠΈ систСмного администратора. НСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚Π΅ Π»ΠΈ Π²Ρ‹ производствСнноС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΎΡ‡ΠΈΡ‰Π°Π΅Ρ‚Π΅ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΈΠ»ΠΈ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ обслуТивания сСрвСра, Python прСдоставляСт ΠΌΠΎΡ‰Π½Ρ‹Π΅ ΠΈ Π³ΠΈΠ±ΠΊΠΈΠ΅ инструмСнты для бСзопасного ΠΈ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠ³ΠΎ удалСния Ρ„Π°ΠΉΠ»ΠΎΠ². Π­Ρ‚ΠΎ руководство ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ комплСксноС практичСскоС руководство ΠΏΠΎ Ρ‚Ρ€Π΅ΠΌ основным модулям Python для удалСния Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² β€” os, shutil ΠΈ pathlib β€” с Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ ошибок ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ ΠΈΠ· Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ ΠΆΠΈΠ·Π½ΠΈ, Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ для ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΉ Linux-сСрвСров.

Если Π²Ρ‹ запускаСтС Python-скрипты Π² ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ VPS Hosting, ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ этих ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π²Π°ΠΌ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‡ΠΈΠ΅ процСссы управлСния Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ, ΡΠ½ΠΈΠ·ΠΈΡ‚ΡŒ Ρ€ΡƒΡ‡Π½Ρ‹Π΅ Π·Π°Ρ‚Ρ€Π°Ρ‚Ρ‹ ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ сСрвСра Π² ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠΌ состоянии.

ΠŸΠΎΡ‡Π΅ΠΌΡƒ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ² Π² Python Π²Π°ΠΆΠ½ΠΎ для управлСния сСрвСром

На ΠΆΠΈΠ²ΠΎΠΌ Linux сСрвСрС β€” особСнно Π½Π° сСрвСрС, Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°ΡŽΡ‰Π΅ΠΌ динамичСскиС Π²Π΅Π±-прилоТСния, ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ CMS, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ WordPress, ΠΈΠ»ΠΈ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Ρ‹ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… β€” Π½Π°ΠΊΠΎΠΏΠ»Π΅Π½Π½Ρ‹Π΅ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹, ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠ΅ Π»ΠΎΠ³ΠΈ ΠΈ потСрянныС Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠ½ΠΈΠ·ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚ΡŒ Ρ†Π΅Π½Π½ΠΎΠ΅ дисковоС пространство. Python скрипты, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ очистку Ρ„Π°ΠΉΠ»ΠΎΠ², Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Π½Π°Π΄Π΅ΠΆΠ½Π΅Π΅ ΠΈ повторяСмСС, Ρ‡Π΅ΠΌ Ρ€ΡƒΡ‡Π½Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ shell, ΠΈ ΠΎΠ½ΠΈ Π»Π΅Π³ΠΊΠΎ ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² cron Π·Π°Π΄Π°Ρ‡ΠΈ, ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Ρ‹ развСртывания ΠΈ систСмы ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π°.

Бтандартная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Python ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Ρ‚Ρ€ΠΈ Π·Ρ€Π΅Π»Ρ‹Ρ… модуля для этой Ρ†Π΅Π»ΠΈ:

ΠœΠΎΠ΄ΡƒΠ»ΡŒΠ›ΡƒΡ‡ΡˆΠΈΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΡΠ’Π΅Ρ€ΡΠΈΡ Python
osНизкоуровнСвыС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ОБ, ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°/дирСкторииВсС вСрсии
shutilВысокоуровнСвыС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, рСкурсивноС ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ дирСкторийВсС вСрсии
pathlibΠžΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ориСнтированная Ρ€Π°Π±ΠΎΡ‚Π° с путями, соврСмСнныС ΠΊΠΎΠ΄ΠΎΠ²Ρ‹Π΅ Π±Π°Π·Ρ‹Python 3.4+

ПониманиС основных ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ

1. ΠœΠΎΠ΄ΡƒΠ»ΡŒ os

ΠœΠΎΠ΄ΡƒΠ»ΡŒ os прСдоставляСт прямой интСрфСйс ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅, запись ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ². На Linux VPS ΠΎΠ½ Π΄Π°Π΅Ρ‚ Π²Π°ΠΌ Ρ‚ΠΎΡ‡Π½Ρ‹ΠΉ, Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ Π½Π°Π΄ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмой.

ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ удалСния:

  • os.remove(path) β€” УдаляСт ΠΎΠ΄ΠΈΠ½ Ρ„Π°ΠΉΠ» ΠΏΠΎ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ ΠΏΡƒΡ‚ΠΈ. Π’Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ FileNotFoundError, Ссли Ρ„Π°ΠΉΠ» Π½Π΅ сущСствуСт.
  • os.unlink(path) β€” Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Π° os.remove(). НазваниС unlink ΠΎΡ‚Ρ€Π°ΠΆΠ°Π΅Ρ‚ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ систСмный Π²Ρ‹Π·ΠΎΠ² POSIX, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ удаляСт запись ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Ρ„Π°ΠΉΠ»Π°.
  • os.rmdir(path) β€” УдаляСт ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³. ΠšΠ°Ρ‚Π°Π»ΠΎΠ³ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ пустым; Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС вызываСтся OSError.

Когда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ: Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ os, ΠΊΠΎΠ³Π΄Π° Π²Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ Ρ‚ΠΎΡ‡Π½Ρ‹ΠΉ, Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ Π½Π°Π΄ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ ΠΈΠ»ΠΈ пустыми ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°ΠΌΠΈ, ΠΈΠ»ΠΈ ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΡ€ΠΈΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒΡΡ сСмантики POSIX.

2. ΠœΠΎΠ΄ΡƒΠ»ΡŒ shutil

ΠœΠΎΠ΄ΡƒΠ»ΡŒ shutil (ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ) прСдоставляСт высокоуровнСвый интСрфСйс для ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ. Π­Ρ‚ΠΎ основной Π²Ρ‹Π±ΠΎΡ€, ΠΊΠΎΠ³Π΄Π° Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Ρ†Π΅Π»Ρ‹Π΅ Π΄Π΅Ρ€Π΅Π²ΡŒΡ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ², Π²ΠΊΠ»ΡŽΡ‡Π°Ρ всС Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ ΠΈ Ρ„Π°ΠΉΠ»Ρ‹.

ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ удалСния:

  • shutil.rmtree(path) β€” РСкурсивно удаляСт ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ ΠΈ всС Π΅Π³ΠΎ содСрТимоС. Π­Ρ‚ΠΎ эквивалСнт Python для rm -rf Π² ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ΅.
  • shutil.move(src, dst) β€” ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Ρ„Π°ΠΉΠ» ΠΈΠ»ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ Π² Π½ΠΎΠ²ΠΎΠ΅ мСсто. Π₯отя Π² основном ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для пСрСмСщСния, Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ удалСния Π² Ρ€Π°Π±ΠΎΡ‡ΠΈΡ… процСссах очистки.

Когда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ: Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ shutil, ΠΊΠΎΠ³Π΄Π° Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, содСрТащий Ρ„Π°ΠΉΠ»Ρ‹ ΠΈΠ»ΠΈ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ.

3. ΠœΠΎΠ΄ΡƒΠ»ΡŒ pathlib

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½Π½Ρ‹ΠΉ Π² Python 3.4, pathlib прСдоставляСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΊ ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ путями Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы. ВмСсто Ρ€Π°Π±ΠΎΡ‚Ρ‹ с сырыми строками Π²Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚Π΅ с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ Path, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΈΠ½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ для ΠΎΠ±Ρ‰ΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ.

ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ удалСния:

  • Path.unlink() β€” УдаляСт Ρ„Π°ΠΉΠ». ΠŸΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ missing_ok=True (Python 3.8+) для подавлСния FileNotFoundError.
  • Path.rmdir() β€” УдаляСт пустой ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³.
  • Для рСкурсивного удалСния pathlib комбинируСтся с shutil.rmtree().

Когда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ: Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ pathlib Π² соврСмСнных ΠΊΠΎΠ΄ΠΎΠ²Ρ‹Ρ… Π±Π°Π·Π°Ρ… Python 3, Π³Π΄Π΅ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΡΡ‚ΡŒ ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π΄ΠΈΠ·Π°ΠΉΠ½.

Настройка вашСй срСды

ΠŸΠ΅Ρ€Π΅Π΄ запуском ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² Π½ΠΈΠΆΠ΅ ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ Python 3 установлСн Π½Π° вашСм сСрвСрС. На VPS Π½Π° основС Debian/Ubuntu Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ это с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ:

python3 --version

Если Python 3 Π½Π΅ установлСн:

sudo apt update && sudo apt install python3 -y

Π£ вас Π΅ΡΡ‚ΡŒ Π΄Π²Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° для запуска ΠΊΠΎΠ΄Π° Python:

Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ A: ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ сСанс Python

python3

Π’ΡΡ‚Π°Π²ΡŒΡ‚Π΅ ΠΊΠΎΠ΄ нСпосрСдствСнно Π² ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΡƒΡŽ подсказку. ПолСзно для быстрых тСстов.

Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ B: Ρ„Π°ΠΉΠ» скрипта Python

Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ скрипт с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ тСкстового Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π°:

nano my_script.py

Π’ΡΡ‚Π°Π²ΡŒΡ‚Π΅ ваш ΠΊΠΎΠ΄, сохранитС с Ctrl+O, Π²Ρ‹ΠΉΠ΄ΠΈΡ‚Π΅ с Ctrl+X, Π·Π°Ρ‚Π΅ΠΌ запуститС:

python3 my_script.py

Для производствСнной Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π° управляСмом сСрвСрС Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ B всСгда рСкомСндуСтся β€” скрипты ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ вСрсии, ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· cron ΠΈ Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ.

ΠŸΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚ΠΎΠ΅ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ²: ΠΏΠΎΠ»Π½Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 1: ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° с os.remove()

Π¨Π°Π³ 1: создайтС тСстовый Ρ„Π°ΠΉΠ» для удалСния.

touch example.txt

Π¨Π°Π³ 2: создайтС скрипт Python.

nano remove_file.py

Π¨Π°Π³ 3: Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄.

import os

file_path = 'example.txt'

try:
    os.remove(file_path)
    print(f'Successfully deleted: {file_path}')
except FileNotFoundError:
    print(f'Error: The file "{file_path}" does not exist.')
except PermissionError:
    print(f'Error: Permission denied β€” unable to delete "{file_path}".')
except Exception as e:
    print(f'An unexpected error occurred: {e}')

Π¨Π°Π³ 4: запуститС скрипт.

python3 remove_file.py

ΠžΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

Successfully deleted: example.txt

Π§Ρ‚ΠΎ это Π΄Π΅Π»Π°Π΅Ρ‚: os.remove() отсоСдиняСт Ρ„Π°ΠΉΠ» ΠΎΡ‚ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы. Π‘Π»ΠΎΠΊ try/except Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡΠΌΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ, прСдотвращая сбой скрипта.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 2: ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ пустого ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° с os.rmdir()

Π¨Π°Π³ 1: создайтС пустой тСстовый ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³.

mkdir example_dir

Π¨Π°Π³ 2: создайтС скрипт Python.

nano remove_directory.py

Π¨Π°Π³ 3: Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄.

import os

directory_path = 'example_dir'

try:
    os.rmdir(directory_path)
    print(f'Successfully deleted directory: {directory_path}')
except FileNotFoundError:
    print(f'Error: The directory "{directory_path}" does not exist.')
except OSError:
    print(f'Error: The directory "{directory_path}" is not empty or cannot be removed.')
except Exception as e:
    print(f'An unexpected error occurred: {e}')

Π¨Π°Π³ 4: запуститС скрипт.

python3 remove_directory.py

ΠžΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

Successfully deleted directory: example_dir

> Π’Π°ΠΆΠ½ΠΎ: os.rmdir() Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ OSError, Ссли ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ содСрТит ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ Ρ„Π°ΠΉΠ»Ρ‹ ΠΈΠ»ΠΈ ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ. Для нСпустых ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ shutil.rmtree() (см. ΠΏΡ€ΠΈΠΌΠ΅Ρ€ 3).

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 3: рСкурсивноС ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° с shutil.rmtree()

Π­Ρ‚ΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ΠΎΠ² Π² скриптах Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ сСрвСра β€” ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ всСго Π΄Π΅Ρ€Π΅Π²Π° ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² Π·Π° ΠΎΠ΄Π½Ρƒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ.

Π¨Π°Π³ 1: создайтС тСстовый ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ Π²Π½ΡƒΡ‚Ρ€ΠΈ.

mkdir -p example_dir_with_content
touch example_dir_with_content/file1.txt
touch example_dir_with_content/file2.txt
mkdir example_dir_with_content/subdir
touch example_dir_with_content/subdir/file3.txt

Π¨Π°Π³ 2: создайтС скрипт Python.

nano remove_directory_content.py

Π¨Π°Π³ 3: Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄.

import shutil

directory_path = 'example_dir_with_content'

try:
    shutil.rmtree(directory_path)
    print(f'Successfully deleted directory and all contents: {directory_path}')
except FileNotFoundError:
    print(f'Error: The directory "{directory_path}" does not exist.')
except PermissionError:
    print(f'Error: Permission denied β€” unable to delete "{directory_path}".')
except Exception as e:
    print(f'An unexpected error occurred: {e}')

Π¨Π°Π³ 4: запуститС скрипт.

python3 remove_directory_content.py

ΠžΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

Successfully deleted directory and all contents: example_dir_with_content

> ΠŸΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅: shutil.rmtree() Π½Π΅ΠΎΠ±Ρ€Π°Ρ‚ΠΈΠΌΠΎ. ВсСгда провСряйтС Ρ†Π΅Π»Π΅Π²ΠΎΠΉ ΠΏΡƒΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² production-скриптах. РассмотритС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ добавлСния подтвСрТдСния ΠΈΠ»ΠΈ Ρ€Π΅ΠΆΠΈΠΌΠ° dry-run для бСзопасности.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 4: ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° с pathlib

ΠœΠΎΠ΄ΡƒΠ»ΡŒ pathlib ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Ρ‡ΠΈΡΡ‚ΡƒΡŽ ΠΈ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΡƒΡŽ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρƒ os.remove().

Π¨Π°Π³ 1: создайтС тСстовый Ρ„Π°ΠΉΠ».

touch example.txt

Π¨Π°Π³ 2: создайтС скрипт Python.

nano pathlib_remove_file.py

Π¨Π°Π³ 3: Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄.

from pathlib import Path

file_path = Path('example.txt')

try:
    file_path.unlink()
    print(f'Successfully deleted: {file_path}')
except FileNotFoundError:
    print(f'Error: The file "{file_path}" does not exist.')
except PermissionError:
    print(f'Error: Permission denied β€” unable to delete "{file_path}".')
except Exception as e:
    print(f'An unexpected error occurred: {e}')

Π¨Π°Π³ 4: запуститС скрипт.

python3 pathlib_remove_file.py

ΠžΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

Successfully deleted: example.txt

Π‘ΠΎΠ²Π΅Ρ‚ для Python 3.8+: Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ file_path.unlink(missing_ok=True) для ΠΌΠΎΠ»Ρ‡Π°Π»ΠΈΠ²ΠΎΠ³ΠΎ пропуска удалСния, Ссли Ρ„Π°ΠΉΠ» Π½Π΅ сущСствуСт, ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΠ² Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ FileNotFoundError Π² Π½Π΅ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½Ρ‹Ρ… скриптах.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 5: ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ пустого ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° с pathlib

nano pathlib_remove_dir.py
from pathlib import Path

directory_path = Path('example_dir')

try:
    directory_path.rmdir()
    print(f'Successfully deleted directory: {directory_path}')
except FileNotFoundError:
    print(f'Error: The directory "{directory_path}" does not exist.')
except OSError:
    print(f'Error: The directory "{directory_path}" is not empty.')
except Exception as e:
    print(f'An unexpected error occurred: {e}')
python3 pathlib_remove_dir.py

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 6: объСдинСниС pathlib ΠΈ shutil для рСкурсивного удалСния

Для рСкурсивного удалСния с использованиСм соврСмСнного стиля pathlib:

import shutil
from pathlib import Path

directory_path = Path('example_dir_with_content')

try:
    shutil.rmtree(directory_path)
    print(f'Successfully deleted: {directory_path}')
except FileNotFoundError:
    print(f'Error: The directory "{directory_path}" does not exist.')
except PermissionError:
    print(f'Error: Permission denied β€” unable to delete "{directory_path}".')
except Exception as e:
    print(f'An unexpected error occurred: {e}')

shutil.rmtree() ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΊΠ°ΠΊ строковыС ΠΏΡƒΡ‚ΠΈ, Ρ‚Π°ΠΊ ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Path, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ эту ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ чистой ΠΈ ΠΈΠ΄ΠΈΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎΠΉ Π² соврСмСнном ΠΊΠΎΠ΄Π΅ Python.

Graceful Error Handling: Best Practices

НадСТная ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ошибок Π½Π΅ являСтся ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΉ Π² production-скриптах β€” это Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ. Π’ΠΎΡ‚ ΠΊΡ€Π°Ρ‚ΠΊΠΎΠ΅ описаниС Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ распространСнных ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ встрСтитС ΠΏΡ€ΠΈ опСрациях удалСния Ρ„Π°ΠΉΠ»ΠΎΠ²:

ExceptionCauseRecommended Response
FileNotFoundErrorΠ¦Π΅Π»Π΅Π²ΠΎΠΉ Ρ„Π°ΠΉΠ» ΠΈΠ»ΠΈ дирСктория Π½Π΅ сущСствуСтЛогируйтС ΠΎΡˆΠΈΠ±ΠΊΡƒ ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°ΠΉΡ‚Π΅; пропуститС ΠΌΠΎΠ»Ρ‡Π°, Ссли это оТидаСтся
PermissionErrorНСдостаточно ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΉ для удалСния Ρ†Π΅Π»Π΅Π²ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°Π›ΠΎΠ³ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΡŒΡ‚Π΅ ΠΎΠΏΠΎΠ²Π΅Ρ‰Π΅Π½ΠΈΠ΅; ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π° Ρ„Π°ΠΉΠ»Π° ΠΈ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ
OSErrorДирСктория Π½Π΅ пуста (для rmdir), ΠΈΠ»ΠΈ другая ошибка уровня ΠžΠ‘Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ shutil.rmtree() для нСпустых Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΉ; ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ Π΄Π΅Ρ‚Π°Π»ΠΈ ошибки
IsADirectoryErroros.remove() Π²Ρ‹Π·Π²Π°Π½ Π½Π° Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈΠŸΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ΡΡŒ Π½Π° os.rmdir() ΠΈΠ»ΠΈ shutil.rmtree()
NotADirectoryErroros.rmdir() Π²Ρ‹Π·Π²Π°Π½ Π½Π° Ρ„Π°ΠΉΠ»Π΅ΠŸΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ΡΡŒ Π½Π° os.remove()

Production-Ready Deletion Function

Π’ΠΎΡ‚ ΠΏΠ΅Ρ€Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠ°Ρ слуТСбная функция, которая бСзопасно ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠ°ΠΊ Ρ„Π°ΠΉΠ»Ρ‹, Ρ‚Π°ΠΊ ΠΈ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ:

import os
import shutil
from pathlib import Path

def safe_delete(target: str, recursive: bool = False) -> bool:
    """
    Safely deletes a file or directory.
    
    Args:
        target: Path to the file or directory to delete.
        recursive: If True, recursively delete directory contents.
    
    Returns:
        True if deletion was successful, False otherwise.
    """
    path = Path(target)
    
    try:
        if path.is_file() or path.is_symlink():
            path.unlink()
            print(f'[OK] Deleted file: {path}')
        elif path.is_dir():
            if recursive:
                shutil.rmtree(path)
                print(f'[OK] Deleted directory (recursive): {path}')
            else:
                path.rmdir()
                print(f'[OK] Deleted empty directory: {path}')
        else:
            print(f'[SKIP] Target does not exist: {path}')
            return False
        return True
    except PermissionError:
        print(f'[ERROR] Permission denied: {path}')
    except OSError as e:
        print(f'[ERROR] OS error for "{path}": {e}')
    except Exception as e:
        print(f'[ERROR] Unexpected error for "{path}": {e}')
    
    return False

# Usage examples
safe_delete('example.txt')
safe_delete('empty_dir')
safe_delete('full_dir', recursive=True)

Π­Ρ‚ΠΎΡ‚ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ ΠΈΠ΄Π΅Π°Π»Π΅Π½ для скриптов развСртывания, ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ Ρ€ΠΎΡ‚Π°Ρ†ΠΈΠΈ Π»ΠΎΠ³ΠΎΠ² ΠΈ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡ очистки, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΡ… Π² ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ VPS Hosting.

ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ использования Π½Π° Linux VPS

ПониманиС удалСния Ρ„Π°ΠΉΠ»ΠΎΠ² Π² Python становится особСнно Ρ†Π΅Π½Π½Ρ‹ΠΌ Π² этих Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… сцСнариях сСрвСра:

АвтоматичСская очистка Π»ΠΎΠ³ΠΎΠ²

Π’Π΅Π±-сСрвСры ΠΈ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ большиС Ρ„Π°ΠΉΠ»Ρ‹ Π»ΠΎΠ³ΠΎΠ². Π‘ΠΊΡ€ΠΈΠΏΡ‚ Python, Π·Π°ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Ρ‡Π΅Ρ€Π΅Π· cron, ΠΌΠΎΠΆΠ΅Ρ‚ автоматичСски ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ Π»ΠΎΠ³ΠΈ ΡΡ‚Π°Ρ€ΡˆΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄Π° хранСния:

import os
from pathlib import Path
from datetime import datetime, timedelta

log_dir = Path('/var/log/myapp')
retention_days = 30
cutoff = datetime.now() - timedelta(days=retention_days)

for log_file in log_dir.glob('*.log'):
    file_mtime = datetime.fromtimestamp(log_file.stat().st_mtime)
    if file_mtime < cutoff:
        log_file.unlink()
        print(f'Deleted old log: {log_file}')

ΠžΡ‡ΠΈΡΡ‚ΠΊΠ° ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π° развСртывания

Π’ΠΎ врСмя развСртывания ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ старыС Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚Ρ‹ сборки ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄ Ρ€Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅ΠΌ Π½ΠΎΠ²Ρ‹Ρ… вСрсий. Π‘ΠΊΡ€ΠΈΠΏΡ‚Ρ‹ Python, ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π² ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Ρ‹ CI/CD, Π½Π°Π΄Π΅ΠΆΠ½ΠΎ ΡΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ с этой Π·Π°Π΄Π°Ρ‡Π΅ΠΉ.

Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ β€” инструмСнты ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΎΡ‚Ρ‡Π΅Ρ‚ΠΎΠ², ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ² β€” Π²Ρ‹ΠΈΠ³Ρ€Ρ‹Π²Π°ΡŽΡ‚ ΠΎΡ‚ Π·Π°ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… скриптов очистки Python, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ исчСрпаниС дискового пространства.

Если Π²Ρ‹ управляСтС нСсколькими прилоТСниями Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π΄ΠΎΠΌΠ΅Π½Π°Ρ…, Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Dedicated Servers прСдоставляСт ΠΏΠΎΠ»Π½Ρ‹ΠΉ root-доступ ΠΈ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ рСсурсы, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ для запуска интСнсивных скриптов Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ Π±Π΅Π· ΠΊΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ†ΠΈΠΈ Π·Π° рСсурсы.

Π’Ρ‹Π±ΠΎΡ€ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ модуля: руководство ΠΏΠΎ ΠΏΡ€ΠΈΠ½ΡΡ‚ΠΈΡŽ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ

Need to delete a single file?
β”œβ”€β”€ Modern codebase (Python 3.4+)? β†’ pathlib Path.unlink()
└── Legacy or compatibility-focused? β†’ os.remove()

Need to delete a directory?
β”œβ”€β”€ Directory is empty?
β”‚   β”œβ”€β”€ Modern codebase? β†’ pathlib Path.rmdir()
β”‚   └── Legacy? β†’ os.rmdir()
└── Directory has contents?
    └── Always β†’ shutil.rmtree()

Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ ΠΏΠΎ бСзопасности для производствСнных срСд

ΠŸΡ€ΠΈ написании скриптов удалСния Ρ„Π°ΠΉΠ»ΠΎΠ² для производствСнных сСрвСров ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅ ΠΎΠ± этих ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°Ρ… бСзопасности:

  1. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠΉΡ‚Π΅ ΠΏΡƒΡ‚ΠΈ ΠΏΠ΅Ρ€Π΅Π΄ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ΠΌ. Никогда Π½Π΅ конструируйтС ΠΏΡƒΡ‚ΠΈ удалСния ΠΈΠ· Π½Π΅ΠΎΡ‡ΠΈΡ‰Π΅Π½Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. ВсСгда Ρ€Π°Π·Ρ€Π΅ΡˆΠ°ΠΉΡ‚Π΅ ΠΈ провСряйтС ΠΏΡƒΡ‚ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Path.resolve() для прСдотвращСния Π°Ρ‚Π°ΠΊ ΠΎΠ±Ρ…ΠΎΠ΄Π° Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΉ.
  1. Π Π΅Π°Π»ΠΈΠ·ΡƒΠΉΡ‚Π΅ Ρ€Π΅ΠΆΠΈΠΌ ΠΏΡ€ΠΎΠ±Π½ΠΎΠ³ΠΎ запуска. ΠŸΠ΅Ρ€Π΅Π΄ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ дСструктивных ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Ρ„Π»Π°Π³ --dry-run, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄Π°Π»Π΅Π½ΠΎ, Π±Π΅Π· фактичСского удалСния.
  1. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ привилСгиями. ЗапускайтС скрипты удалСния с минимально Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΌΠΈ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡΠΌΠΈ. Π˜Π·Π±Π΅Π³Π°ΠΉΡ‚Π΅ запуска скриптов управлСния Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ ΠΎΡ‚ ΠΈΠΌΠ΅Π½ΠΈ root, Ссли это Π½Π΅ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ.
  1. Π›ΠΎΠ³ΠΈΡ€ΡƒΠΉΡ‚Π΅ всС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ удалСния. Π’Π΅Π΄ΠΈΡ‚Π΅ ΠΆΡƒΡ€Π½Π°Π» Π°ΡƒΠ΄ΠΈΡ‚Π° ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ удалСния Ρ„Π°ΠΉΠ»Π° с Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ ΠΌΠ΅Ρ‚ΠΊΠ°ΠΌΠΈ, Ρ†Π΅Π»Π΅Π²Ρ‹ΠΌΠΈ путями ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΈΠ»ΠΈ процСссом, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Π» ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ.
  1. Π‘Π½Π°Ρ‡Π°Π»Π° создайтС Ρ€Π΅Π·Π΅Ρ€Π²Π½Ρ‹Π΅ ΠΊΠΎΠΏΠΈΠΈ критичСских Π΄Π°Π½Π½Ρ‹Ρ…. Для скриптов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠ΄Π°Π»ΡΡŽΡ‚ Π΄Π°Π½Π½Ρ‹Π΅ прилоТСния, ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ Ρ€Π΅Π·Π΅Ρ€Π²Π½Ρ‹Π΅ ΠΊΠΎΠΏΠΈΠΈ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹. Π‘ΠΎΡ‡Π΅Ρ‚Π°Π½ΠΈΠ΅ вашСго сСрвСра с Π½Π°Π΄Π΅ΠΆΠ½Ρ‹ΠΌΠΈ SSL Certificates ΠΈ бСзопасными стратСгиями Ρ€Π΅Π·Π΅Ρ€Π²Π½ΠΎΠ³ΠΎ копирования Π·Π°Ρ‰ΠΈΡ‰Π°Π΅Ρ‚ Π²Π°ΡˆΡƒ инфраструктуру Π² Ρ†Π΅Π»ΠΎΠΌ.

Π₯остинг Python ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΈ скриптов Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ

Если Π²Ρ‹ Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚Π΅ инструмСнты Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π° Python, Π²Π΅Π±-прилоТСния ΠΈΠ»ΠΈ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Ρ‹ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΠ΅ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠ³ΠΎ управлСния Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ, ваша срСда хостинга ΠΈΠΌΠ΅Π΅Ρ‚ большоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

  • VPS Hosting β€” ИдСалСн для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² Python, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π½ΡƒΠΆΠ΅Π½ ΠΏΠΎΠ»Π½Ρ‹ΠΉ доступ root, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ окруТСния Python ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ запуска Ρ„ΠΎΠ½ΠΎΠ²Ρ‹Ρ… скриптов ΠΈ cron Π·Π°Π΄Π°Π½ΠΈΠΉ. VPS ΠΏΠ»Π°Π½Ρ‹ AlexHost Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π½Π° SSD Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ для быстрых ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°.
  • Dedicated Servers β€” Π›ΡƒΡ‡ΡˆΠΈΠΉ Π²Ρ‹Π±ΠΎΡ€ для Π²Ρ‹ΡΠΎΠΊΠΎΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ… большиС ΠΎΠ±ΡŠΠ΅ΠΌΡ‹ Ρ„Π°ΠΉΠ»ΠΎΠ², Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΌΠ΅Π΄ΠΈΠ°, Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ ΠΊΡ€ΡƒΠΏΠ½ΠΎΠΌΠ°ΡΡˆΡ‚Π°Π±Π½Ρ‹Π΅ Π²Π΅Π±-скрСпСры.
  • Shared Web Hosting β€” ΠŸΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Π²Π΅Π±-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° Python, Π³Π΄Π΅ ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ Π½Π°Π΄ сСрвСром Π½Π΅ трСбуСтся ΠΈ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ β€” ΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‡Π½ΠΎΡΡ‚ΡŒ.
  • GPU Hosting β€” Π‘ΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½ для машинного обучСния Π½Π° Python ΠΈ Ρ€Π°Π±ΠΎΡ‡ΠΈΡ… Π½Π°Π³Ρ€ΡƒΠ·ΠΎΠΊ AI, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ большиС Ρ„Π°ΠΉΠ»Ρ‹ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ ΠΈ Π½Π°Π±ΠΎΡ€Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΠ΅ автоматичСской очистки ΠΈ управлСния Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ΠΌ.

РСзюмС

ΠœΠΎΠ΄ΡƒΠ»ΠΈ os, shutil ΠΈ pathlib Python вмСстС ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ ΠΏΠΎΠ»Π½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ инструмСнтов для удалСния Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² Π² любой срСдС. Π’ΠΎΡ‚ краткая справка:

Π—Π°Π΄Π°Ρ‡Π°Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄
Π£Π΄Π°Π»ΠΈΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ Ρ„Π°ΠΉΠ»pathlib.Path.unlink() ΠΈΠ»ΠΈ os.remove()
Π£Π΄Π°Π»ΠΈΡ‚ΡŒ пустой ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³pathlib.Path.rmdir() ΠΈΠ»ΠΈ os.rmdir()
Π£Π΄Π°Π»ΠΈΡ‚ΡŒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ с содСрТимымshutil.rmtree()
Π£Π΄Π°Π»ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ ΠΏΠΎ ΡˆΠ°Π±Π»ΠΎΠ½Ρƒpathlib.Path.glob() + Path.unlink()
БСзопасноС ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ с ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ ΠΎΡˆΠΈΠ±ΠΎΠΊΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠ°Ρ функция ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ (см. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 6)

ОвладСв этими ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ, Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ:

  • ΠΠ²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ обслуТиваниС Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы Π½Π° production-сСрвСрах Π±Π΅Π· Ρ€ΡƒΡ‡Π½ΠΎΠ³ΠΎ Π²ΠΌΠ΅ΡˆΠ°Ρ‚Π΅Π»ΡŒΡΡ‚Π²Π°
  • ΠŸΠΈΡΠ°Ρ‚ΡŒ Π½Π°Π΄Π΅ΠΆΠ½Ρ‹Π΅ скрипты, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ Π³Ρ€Π°Π½ΠΈΡ‡Π½Ρ‹Π΅ случаи Π±Π΅Π· сбоСв
  • Π˜Π½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ Π² ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Ρ‹ развСртывания, задания cron ΠΈ систСмы ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π°
  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ сСрвСра Π² чистотС ΠΈ организованности, ΡƒΠ»ΡƒΡ‡ΡˆΠ°Ρ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ прилоТСния ΠΈ сниТая Π·Π°Ρ‚Ρ€Π°Ρ‚Ρ‹ Π½Π° хостинг

УправляСтС Π»ΠΈ Π²Ρ‹ ΠΎΠ΄Π½ΠΈΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π½Π° VPS с cPanel ΠΈΠ»ΠΈ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΡƒΠ΅Ρ‚Π΅ слоТныС Ρ€Π°Π±ΠΎΡ‡ΠΈΠ΅ процСссы с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ Π½Π° мноТСствС сСрвСров, возмоТности удалСния Ρ„Π°ΠΉΠ»ΠΎΠ² Python Π΄Π°ΡŽΡ‚ Π²Π°ΠΌ Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ ΠΈ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΡΡ‚ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ваша инфраструктура.