uv और PEP 723 के साथ Python स्क्रिप्ट्स का उपयोग
(cottongeeks.com)- uv package manager और PEP 723 की मदद से dependency समस्याओं के बिना Python scripts चलाना संभव हो गया है
- uvx फीचर disposable virtual environment अपने-आप बनाता है, जिससे environment setup की झंझट खत्म होती है
- अगर PEP 723 metadata को Python फ़ाइल में शामिल किया जाए, तो script का automatic execution और package management काफी आसान हो जाता है
- execution script example के रूप में YouTube subtitle extraction program को तेज़ी से implement और deploy किया जा सकता है
- इससे अब Python में भी संक्षिप्त single-executable script लिखना संभव हो गया है, और scripts की उपयोगिता काफी बढ़ गई है
अवलोकन
- Python में "one-off script" चलाने के लिए हर बार environment setup और package installation की प्रक्रिया से गुजरना पड़ता था, लेकिन uv और PEP 723 के आने से यह असुविधा लगभग खत्म हो गई है
- uv, Rust में विकसित एक high-speed Python package और project manager है, और इसका नया uvx फीचर disposable virtual environment setup, automatic package installation, और Python version linking को बहुत तेज़ और आसान बनाता है
uv और uvx के फायदे
- uvx फीचर Nodejs ecosystem के npx की तरह काम करता है और किसी निर्दिष्ट Python package (जैसे ruff) के लिए तेज़ी से execution environment तैयार करता है
- disposable virtual environment को cache के रूप में इस्तेमाल करके बिना overhead के तेज़ execution देता है
- environment setup और dependency installation एक ही command line में हो जाते हैं, इसलिए developer को अलग से environment management की ज़रूरत नहीं पड़ती
PEP 723 का परिचय और उपयोग
- PEP 723 ऐसा standard define करता है जिससे Python script के शीर्ष पर dependency और environment metadata शामिल किया जा सके
- उदाहरण: code के ऊपर requires-python, dependencies आदि को लिखा जा सकता है
- इन जानकारियों को पहचानने वाले external tools (जैसे uv) script फ़ाइल में लिखी metadata के आधार पर automatic installation, environment setup, और execution संभाल लेते हैं
uv और PEP 723 का संयोजन
- वास्तविक Python example file के शीर्ष पर यह metadata लिखने के बाद, uv के run command से execution करते ही ज़रूरी सभी packages अपने-आप install हो जाते हैं, तय Python version set हो जाता है, और फिर code चल जाता है
- उदाहरण code internet API (PEP list) को call करता है और result को print करता है। अतिरिक्त package installation या environment setup के बिना इसे एक line में चलाया जा सकता है
व्यावहारिक उदाहरण: YouTube subtitle script
- shebang(
#!/usr/bin/env -S uv run --script) और PEP 723 metadata जोड़ी हुई Python script का उदाहरण दिया गया है - youtube-transcript-api जैसे external package अपने-आप install हो जाते हैं और virtual environment भी automatically set हो जाता है
- user executable file(
ytt) को चलाते समय YouTube video URL या ID argument के रूप में देता है, और script subtitles निकालकर तुरंत result दे देती है chmodसे execution permission देने के बाद इसे terminal में आसानी से चलाया जा सकता है
developer experience में सुधार और संभावनाओं का विस्तार
- पहले साधारण script execution के लिए भी Go जैसी single-executable binary languages को अधिक पसंद किया जाता था, लेकिन अब Python भी लगभग उसी स्तर की सुविधा देता है
- uv और PEP 723 के संयोजन से Python scripts को share करना, deploy करना, और उनका automated execution करना काफी आसान हो गया है
- Github example (cottongeeks/ytt-mcp) के माध्यम से और भी जटिल use cases विकसित किए जा सकते हैं
2 टिप्पणियां
uvबहुत ही तेज़ है, इसलिए मुझे यह काफ़ी पसंद आया। आजकल मैं जहाँ भी संभव हो, हर जगहuvका इस्तेमाल कर रहा हूँ।Hacker News राय
पोस्ट लिखने वाले की तरह आजकल मैं भी Go की बजाय cross-platform Python one-off और personal scripts की तरफ ज़्यादा झुकता हूँ, लेकिन Python का type checking system अभी भी पूरी तरह अराजक लगता है; उम्मीद है कि ty, pyrefly जैसे tools इससे थोड़ा सुधार लाएँगे
अब Python scripts ऐसा महसूस कराती हैं कि वे virtualenv की वजह से परेशान किए बिना सीधे ठीक से चल जाती हैं अच्छा होगा अगर shell scripts में भी ऐसा अनुभव मिल सके packaging, dependency management और reproducibility अभी भी पत्थर युग जैसी हालत में हैं अभी भी हक़ीक़त यही है कि या तो
curl | bashके भरोसे किस्मत आज़माओ, या फिर ऐसा README मिले जिसमें 3 missing dependencies और 12 manual steps हों Nix? ऐसा विकल्प लगता है जो केवल उन्हीं के काम का है जो समय, स्थान और Nix manual—तीनों से परे जा चुके हों Docker? अगर सिर्फ़ एकsedcommand चलाने के लिए Linux distribution डाउनलोड करना आपको तर्कसंगत लगता है, तो ठीक है सच में एक आसान, declarative middle ground की ज़रूरत है जिसे हर कोई इस्तेमाल कर सकेuvजैसा tool सब संभाल लेता है अगर आपको Clojure पसंद है, तो babashka भी सुझाऊँगायह सच में शानदार trend है और लगता है कि धीरे-धीरे mainstream हो रहा है मैंने इसे पहली बार simonw के blog में देखा था, और simonwillison की blog post में इससे जुड़ी बातें देखीं इस साल मार्च में एक और blog post पर Hacker News चर्चा भी हुई थी अच्छा होगा अगर यह trend main page पर लंबे समय तक रहे ताकि ज़्यादा लोग इसके बारे में जानें
छोटे projects में
uvइस्तेमाल करके अनुभव वाकई शानदार रहाuv runऔरuv tool run(uvx) के संयोजन से GitHub की Python scripts को VM पर सीधे install और run करना बेहद आसान हो जाता है नgit cloneकी ज़रूरत, नvenvबनाने या उसमें जाने की, नpip installकी सबसे बढ़कर,uvइतना तेज़ है कि शुरुआत में लगा जैसे कुछ गड़बड़ है; असल में यहpipसे 10 गुना तेज़ निकला हाँ, tool और documentation अभी थोड़ा अधूरा है, लेकिन इसकी innovation और practicality इतनी है कि फिर भी यह पूरी तरह उपयोगी हैuvdependencies install करने का कामpyenvके--helpoutput दिखाने से भी तेज़ कर देता हैRust भी इसी तरह single-file typed shell script जैसी सोच को आगे बढ़ा रहा है मैंने इस तरह का approach पहली बार Rust में देखा था, जहाँ dependencies सहित single-file execution support मिलता है उम्मीद है यह pattern और भाषाओं में भी जमे, क्योंकि gist के रूप में आदान-प्रदान करने या छोटे तेज़ tools लिखने के लिए यह बहुत उपयोगी है cargo-script RFC document भी देख सकते हैं
uv run --scriptइस्तेमाल करते समय अगर metadata script में शामिल हो, तो script से सीधे Python REPL खोलकर edit-test करना थोड़ा असुविधाजनक है उदाहरण के लिए, ऐसा करना पड़ता है:काश इसका कोई और संक्षिप्त तरीका होता जैसे कि
ऐसा हो पाता तो सबसे अच्छा लगता, लेकिन वास्तव में नीचे दिए तरीके से script के अनुरूप Python और venv environment में सीधे प्रवेश किया जा सकता है
हालाँकि environment बनाने के लिए script को कम से कम एक बार चलाना पड़ेगा
--interactiveजैसा flag जोड़कर इसे CLI option बनाया जा सकता है मैं अक्सर Typer आधारित छोटी CLI इसी तरह लिखता हूँ dev script में--sqlflag से DuckDB SQL REPL में जाने का अनुभव भी रहा हैअगर आप conda इस्तेमाल करते हैं, तो Python script के लिए shell wrapper में environment को सीधे activate करने का तरीका भी है इसे इस तरह लिखा जा सकता है
लेकिन यह PEP 723 style जितना self-contained approach नहीं है
कल और आज HN thread देखकर पहली बार
uvआज़माने का फ़ैसला किया, और इसकी speed तथा आसान dependency management से बहुत प्रभावित हुआ अगर official docs और बेहतर हो जाएँ तो और अच्छा होगा, खासकरrequirements.txtworkflow सेuvपर जाने की guide मिले तो सुविधा होगी project-specific Python version तय करने का हिस्सा थोड़ा confusing है (.python-versionऔरpyproject.tomlदोनों जगह definition)pyproject.tomlकाrequires-versionfield compatible versions की range बताता है, जबकि.python-versiondevelopment के लिए उपयोग होने वाला specific version तय करता हैuv initसे शुरू में दोनों एक जैसे लग सकते हैं, लेकिन समय के साथrequires-version,.python-versionकी तुलना में कम minimum supported version दिखाने लगता हैrequires-versionpackage metadata में भी जाता है, और आपके publish किए गए package का उपयोग करने वाले अन्य लोगों की dependency resolution को भी प्रभावित करता है उदाहरण के लिए, अगर v1 पुराने Python 3 versions को support करता हो लेकिन v2 नहींnpmयाdotnetकी तरह platform बदलने परnpm updateयाdotnet restoreचलाना पड़ सकता है, लेकिनvenvआम तौर पर बिना दिक्कत चलता है जबकिuvमें platform switch के समय चीज़ें थोड़ी ज़्यादा जटिल लगती हैं और manual cleanup की ज़रूरत महसूस होती हैpyproject.toml(खुदuvसे अलग) बाहरी developers और users के साथ code share करने के लिए environment definition का काम करता है यानी PyPI package build करते समय किस environment की ज़रूरत है, यह बताना; version range भी इसलिए तय की जाती है ताकि दूसरे लोग code को ज़्यादा व्यापक रूप से reuse कर सकें.python-versionसिर्फ़uvके लिए है, और वह भी केवल मेरे development environment setup के संदर्भ में अगर environment पहले से बना हुआ है, तो इसे दोबारा सेट करने की ज़रूरत नहींuvअभी official build backend नहीं है, लेकिन इस दिशा में काम चल रहा है (issue #3957).python-versionfile का काम TOML parser न रखने वाले दूसरे tools के साथ compatibility भर हैपहले मैंने ऐसा tool बनाने की सोची थी जो Python scripts को खुद अपनी dependencies install करने दे (लक्ष्य
uvxजैसा व्यवहार था, लेकिन ऐसा कि केवल Python होने पर भी चल सके) लेकिन कमी यह थी कि script की शुरुआत में कई अजीब दिखने वाली lines जोड़नी पड़ती थीं अगर जिज्ञासा हो, तो यह PyPI परpysolateनाम से उपलब्ध हैCOBOL से प्रेरित Grace Hopper style का संदेश तर्क यह है कि हर Python program में एक ENVIRONMENT division होनी चाहिए, जिसमें compile और execution environment—hardware और software requirements सहित—स्पष्ट रूप से लिखे जाएँ ऐसी संरचना अलग-अलग systems के बीच program portability सुधारने में निर्णायक हो सकती है