- uv पर स्विच करने से Python dependencies की installation speed, pip की तुलना में लगभग 10 गुना तेज हो जाती है, और अलग venv के बिना non-root user के रूप में भी चलाया जा सकता है
- pyproject.toml आधारित सेटअप में सिर्फ top-level dependencies लिखनी होती हैं; uv अपने आप lock file मैनेज करता है, और dependency tree व सटीक version management के मामले में pip freeze से बेहतर है
- Dockerfile में uv और uvx binaries कॉपी करना, pyproject.toml/uv.lock फाइलें इस्तेमाल करना, environment variables सेट करना जैसी step-by-step बदलावों की जरूरत होती है
- uv sync/add/remove, uv:outdated जैसे commands से dependencies जोड़ना, हटाना, अपडेट करना और package के latest versions देखना आसान हो जाता है
- lock file को नियमित रूप से मैनेज करना और dependencies अपडेट करना आसान होने से collaboration और deployment environments में consistency बनाए रखने का फायदा मिलता है
10 गुना तेज dependency installation, venv के बिना, non-root environment सेटअप
- uv, pip की तुलना में Python projects में dependency installation speed को काफी बेहतर बनाने वाला tool है
- uv अपनाने से Flask/Django जैसे अलग-अलग projects में, मौजूदा pip setup की तुलना में लगभग 10 गुना तेज installation speed मिल सकती है
- अलग virtual environment (venv) के बिना भी container के अंदर non-root user के रूप में सुरक्षित तरीके से run किया जा सकता है
pyproject.toml vs requirements.txt
- मौजूदा requirements.txt की जगह pyproject.toml फाइल में सिर्फ top-level dependencies लिखने पर uv अपने आप uv.lock फाइल बना देता है
- pyproject.toml में
[project] dependencies एंट्री जोड़ें
- मौजूदा requirements.txt हटाएँ
- uv की lock file, pip freeze के output जैसी लगती है, लेकिन इसमें सटीक dependency tree और version information शामिल होती है
Dockerfile कॉन्फ़िगरेशन में बदलाव
- uv और uvx binaries को container में कॉपी करके इस्तेमाल किया जाता है (static compiled Rust binaries का उपयोग)
- मौजूदा requirements*.txt की जगह pyproject.toml, uv.lock* फाइलें कॉपी करें
- environment variables जोड़ें:
UV_COMPILE_BYTECODE=1: build stage में पहले से bytecode compile करना
UV_PROJECT_ENVIRONMENT="/home/python/.local": अलग venv बनाए बिना एक तय path पर packages install करना
- dependency installation command भी मौजूदा
pip3-install की जगह uv-install में बदलती है
- उदाहरण:
RUN chmod 0755 bin/* && bin/uv-install
dependency जोड़ना, हटाना, अपडेट करना आदि
- अलग run script के जरिए container के अंदर uv commands चला सकते हैं
./run deps:install: image build के बाद lock file को host पर export करते हुए install करना
./run deps:install --no-build: build के बिना सिर्फ lock file अपडेट करना
./run uv add mypackage --no-sync: सिर्फ pyproject.toml और lock file अपडेट करना, actual install बाद में चलाना
./run uv remove mypackage --no-sync: package हटाना
./run uv:outdated: मौजूदा dependencies के latest versions देखना
वीडियो और hands-on गाइड उपलब्ध
- uv अपनाने, pyproject.toml लिखने, Dockerfile बदलने, lock/sync commands, dependencies जोड़ने/हटाने, latest versions देखने आदि के लिए वास्तविक demo और git diff examples दिए गए हैं
- Flask और Django, दोनों projects के migration diff भी संदर्भ के लिए उपलब्ध हैं
2 टिप्पणियां
वैसे भी मैं poetry से डिप्लॉय किए जा रहे सेटअप को माइग्रेट करने की सोच रहा था, और यह स्थिर और सरल लग रहा है ^^
Hacker News राय
यह ध्यान देने की ज़रूरत है कि uv ऐसा workflow सपोर्ट करता है जो pyenv, virtualenv और pip को सीधे replace कर सकता है। यह lockfile या pyproject.toml से मजबूर किया गया तरीका नहीं है।
uv python pin <version>कमांड से मौजूदा directory में .python-version फ़ाइल बनाई जा सकती है,uv virtualenvसे pyenv की तरह उस version का Python डाउनलोड करके .venv virtual environment बनाया जा सकता है,uv pip install -r requirements.txtसे requirements.txt के packages install किए जा सकते हैं, औरuv run <command>से .env फ़ाइल के environment variables सहित कमांड चलाया जा सकता है। बस environment variable precedence की समस्या से सावधान रहना चाहिए (संबंधित issue)यह तरीका lock file के मौजूद होने के अर्थ को फीका कर देता है। अगर फ़ाइल नहीं है या invalid है, तो इसका मतलब है कि lock file में गंभीर समस्या है और ऐसे में बेहतर यही है कि उस प्रोजेक्ट से परिचित व्यक्ति सीधे इसका समाधान करे। वरना lock file रखने का कोई कारण नहीं बचता। CI में lock file अपने-आप replace हो जाए तो उलझन पैदा हो सकती है
uv lockfriendly message के साथ fail होता है और shell script का errexit तुरंत execution रोक देता है।uv lock --checkमें error redirect करने का मकसद वही error दो बार print होने से रोकना है। अगर lock फ़ाइल को जानबूझकर गलत बनाकर script चलाई जाए, तो specific error message के साथ build रुक जाता है। script को if-else में बदलकर और स्पष्ट कर दिया गया है। lock फ़ाइल न हो तो उसे नया बनाना सही flow है। फिर उसे generate करके commit किया जा सकता हैuv sync --lockedoption यह हिस्सा cover करता है। lock file न हो या पुरानी हो तो यह साफ़ तौर पर fail करता है। हमेशा--lockedoption के साथ build करने की सलाह है--frozenflag का मतलब होना चाहिए कि lock file update न हो, लेकिन व्यवहार उल्टा है। lock file न हो या match न करे तो इंसानी दखल ज़रूरी है, इस बात से सहमत हूँPython tools का Python के बाहर की भाषा में लिखा जाना मुझे पूरी तरह गलत दिशा लगता है। C पहले से मौजूद है और CPython standardized है, तो बेवजह किसी नई भाषा (जैसे Rust) की ज़रूरत नहीं। Pendulum package में 3.13 support 7 महीने से ज़्यादा देर से आया, और मेरा मानना है कि इसकी वजह Rust native code थी क्योंकि उसे ठीक कर सकने वाले लोग कम थे। अगर यह C में होता तो मैं खुद ठीक कर देता। (संबंधित issue) आदर्श रूप में, अगर Rust जैसी बाहरी भाषा में तेज़ datetime बनाना है, तो उसे FFI के ज़रिए ऐसे रूप में बनाना चाहिए जिसे कई भाषाएँ इस्तेमाल कर सकें। Rust-based तरीका अभी भी खास पसंद नहीं, और Linux community के हिचकिचाने की वजह अब समझ आती है
pip की जगह uv इस्तेमाल करते समय सावधान रहना चाहिए। default रूप से यह pyc files नहीं बनाता, इसलिए service startup धीमा हो सकता है (संदर्भ)
flask container में uv इस्तेमाल करने पर सिर्फ build time का अंतर ही बहुत बड़ा नहीं होता, installation process भी बहुत predictable हो जाती है। pip के साथ dependency versions बदल जाने वाली परेशानी नहीं रहती। pyproject.toml इस्तेमाल करें,
uv lockचलाएँ और काम हो गया। docker में सिर्फ pyproject.toml और uv.lock फ़ाइलें copy (HOT COPY) करकेuv sync --frozen --no-install-projectचलाने से app code को छोड़े बिना installation layer को cache किया जा सकता है। अगर आपने सिर्फ एक package बदलने पर पूरी layer फिर से rebuild होने का दर्द देखा है, तो समझ आएगा कि यह feature क्यों महत्वपूर्ण है। environment variableUV_PROJECT_ENVIRONMENT=/home/python/.localइस्तेमाल करने पर venv के बिना base image को pre-warm किया जा सकता है, जिससे build sharing और infra cost कम होती है।UV_COMPILE_BYTECODE=1option से build के समय .pyc files बनाई जा सकती हैं। mutable environment खत्म हो जाता है और reproducibility लागू होती है; अब अगर build fail होता है, तो वजह साफ़ तौर पर lockfile पर आती है2025 में भी Python packaging और dependency management अब भी अव्यवस्थित है
uv, pip, conda जैसे Python package managers की security तुलना जानने की उत्सुकता है। speed अच्छी बात है, लेकिन package manager की security उससे कहीं ज़्यादा महत्वपूर्ण लगती है
मैं PyPI पर package publish करता हूँ, इसलिए व्यक्तिगत रूप से speed की वजह से uv इस्तेमाल करना चाहता हूँ, लेकिन अगर यह गारंटी न हो कि इसका व्यवहार pip जैसा ही होगा, तो आसानी से switch नहीं कर सकता। अगर users को
pip install xxxमें error मिले, तो मुझे भी वही environment दोहराकर reproduce और debug करना पड़ता हैमुझे लगता है कि UV हाल के Python packaging में सबसे सकारात्मक बदलावों में से एक है—बस चलाइए और यह अच्छा परिणाम देता है
production environment containers बनाने के लिए uv पर एक शानदार guide भी साझा की गई है (guide देखें)