Python билан ишлайдиган ҳар қандай лойиҳа, хоҳ у сайт, хоҳ Telegram бот ёки кунлик ҳисобот скрипти бўлсин, ташқи кутубхоналарга таянади. Локал компьютерда уларни pip install билан ўрнатиш оддий, лекин хостингда тизимга пакет ўрнатиш ҳуқуқингиз бўлмайди ва бўлиши ҳам шарт эмас. Бу муаммони виртуал муҳит, яъни venv ҳал қилади: у лойиҳа папкасининг ичида алоҳида Python нусхаси ва кутубхоналар тўпламини яратади. Қуйида venv'ни хостингда қандай яратиш, ишлатиш ва кейинчалик бузилмаслиги учун нималарга эътибор беришни тушунтирамиз.
Виртуал муҳит нима учун керак
Серверда битта умумий Python бўлиши мумкин, унинг кутубхоналари эса тизим администратори томонидан бошқарилади. Агар ҳар бир лойиҳа кутубхоналарни шу умумий жойга ўрнатса, бир лойиҳа учун янгиланган пакет бошқасини бузиб қўйиши ҳеч гап эмас. Виртуал муҳит ҳар бир лойиҳага ўзининг ёпиқ "қутисини" беради: унда ўзининг pip буйруғи, ўзининг кутубхона версиялари ва ўзининг созламалари бўлади. Бундан ташқари, venv яратиш учун администратор ҳуқуқи керак эмас, шунинг учун у оддий хостинг фойдаланувчиси учун ҳам очиқ.
Мисол сифатида Намангандаги нонвойхонани олайлик. Унинг эгаси ҳар куни эрталаб кечаги буюртмалар бўйича қисқа ҳисоботни Telegram орқали олишни хоҳлайди. Дастурчи бунинг учун кичик Python скрипт ёзди, у requests ва openpyxl кутубхоналаридан фойдаланади. Скрипт хостингда cron орқали ишлайди ва унинг барча кутубхоналари лойиҳа ичидаги venv'да туради.
Venv яратиш ва фаоллаштириш
SSH орқали хостингга кириб, лойиҳа папкасига ўтинг ва виртуал муҳитни яратинг. Агар серверда бир нечта Python версияси бўлса, керакли версияни аниқ кўрсатган маъқул, чунки venv қайси Python билан яратилган бўлса, бутун умри давомида ўша версияда қолади.
cd ~/report
python3 --version
python3 -m venv venv
source venv/bin/activate
python -m pip install --upgrade pip
Фаоллаштирилгандан кейин терминал сатри бошида (venv) ёзуви пайдо бўлади ва python ҳамда pip буйруқлари энди виртуал муҳитга тегишли бўлади. Буни текшириш осон: which python буйруғи лойиҳа ичидаги venv/bin/python йўлини кўрсатиши керак. Ишни тугатгач deactivate буйруғи билан оддий ҳолатга қайтасиз. Windows'да локал ишлаганда фаоллаштириш буйруғи бошқача, у venv\Scripts\activate кўринишида бўлади.
Кутубхоналарни requirements.txt орқали бошқариш
Кутубхоналарни битталаб эслаб қолиш ўрнига, уларнинг рўйхатини requirements.txt файлида сақлаш қулай. Локал компьютерда лойиҳа тайёр бўлгач, рўйхатни яратасиз, серверда эса ундан ўрнатасиз:
# lokal kompyuterda
pip freeze > requirements.txt
# serverda, faollashtirilgan venv ichida
pip install --no-cache-dir -r requirements.txt
pip freeze аниқ версияларни ёзиб қўяди, шунинг учун серверда ҳам локал компьютердаги билан бир хил тўплам ўрнатилади. --no-cache-dir параметри эса юклаб олинган пакетларни уй каталогидаги кешда сақламайди. Хостингда диск ҳажми тариф билан чекланган ва pip кеши сезиларли жой эгаллаши мумкин, шунинг учун бу параметр фойдали. Кеш аллақачон тўпланиб қолган бўлса, pip cache purge уни тозалайди.
Venv'ни бошқа компьютердан кўчириб бўлмайди
Кўп учрайдиган хато бу локал компьютерда яратилган venv папкасини FTP орқали серверга юклашдир. Виртуал муҳит ичида уни яратган Python'га мутлақ йўллар ёзилган бўлади, баъзи кутубхоналар эса айнан шу оператсион тизим учун компиляция қилинган файлларни ўз ичига олади. Windows'да яратилган venv'да ҳатто папкалар тузилиши ҳам бошқача. Шунинг учун серверга фақат код ва requirements.txt юкланади, venv эса сервернинг ўзида яратилади. Git ишлатсангиз, venv/ қаторини .gitignore файлига қўшиб қўйинг.
Црон ва скриптларда venv'ни фаоллаштирмасдан ишлатиш
Црон source venv/bin/activate буйруғини бажармайди ва сизнинг терминал муҳитингизни билмайди. Лекин бунинг кераги ҳам йўқ: виртуал муҳитдаги Python'ни тўлиқ йўл билан чақириш кифоя, у ўз кутубхоналарини ўзи топади. Нонвойхона ҳисоботи учун ҳар куни соат 7:30 да ишлайдиган cron қатори қуйидагича бўлади:
30 7 * * * /home/login/report/venv/bin/python /home/login/report/daily.py >> /home/login/report/daily.log 2>&1
Бу ерда йўллар намуна сифатида берилган, ўзингизнинг уй каталогингизни echo $HOME буйруғи билан билиб олишингиз мумкин. Сервер вақт минтақаси Ўзбекистон вақтидан фарқ қилиши мумкинлигини ҳам ҳисобга олинг ва керак бўлса соатни мосланг. Охиридаги йўналтириш хатоларни лог файлига ёзади, шунда скрипт ишламай қолса, сабабини ўша ердан топасиз. Оддий хостингда cron қаторини ISPmanager панелидаги режалаштирувчи бўлимида қўшиш мумкин.
Типик хатолар ва уларнинг ечими
Баъзи Debian ва Ubuntu тизимларида venv яратишда ensurepip is not available деган хато чиқади. Бу Python'нинг venv модули алоҳида пакет сифатида ўрнатилмаганини билдиради. Ўз VPS серверингизда уни sudo apt install python3-venv билан ўрнатасиз, оддий хостингда эса буни техник ёрдамдан сўраш керак бўлади. Python версияси янгилангандан кейин эски venv ишламай қолиши мумкин; бундай ҳолда venv папкасини ўчириб, уни янгидан яратиш ва requirements.txt дан қайта ўрнатиш энг тез йўл.
Шуни ҳам ёдда тутинг: хостингда Python скриптларини ишга тушириш имконияти, SSH кириш ва мавжуд Python версиялари тарифга боғлиқ. Буни sayt.uz кабинетидан ёки техник ёрдам орқали аниқлаб олинг. Бир марталик ёки режалаштирилган скриптлар учун оддий хостинг етарли бўлиши мумкин, лекин кун бўйи тўхтовсиз ишлаши керак бўлган бот ёки хизмат учун VPS анча ишончли танлов ҳисобланади.