virtualenv ও pip
এই পাঠে যা শিখবেন
- "Dependency hell" কী — কেন venv দরকার
venvবানানো, activate, deactivatepip install,pip list,pip freezerequirements.txtদিয়ে reproducible setup- conda কখন বেছে নেবেন
- আধুনিক tool — poetry, uv — সংক্ষেপে
১ · কেন virtual environment?
আপনি দু'টি প্রজেক্টে কাজ করছেন। Project A — TensorFlow ২.১০, NumPy ১.২৩। Project B — TensorFlow ২.১৬, NumPy ১.২৬। দু'টি একই Python install-এ থাকতে পারে না — version conflict। সমাধান: প্রতিটি প্রজেক্টের জন্য আলাদা virtual environmentVirtual environmentএকটি isolated directory যেখানে নিজস্ব Python interpreter ও site-packages। Activate করলে — সেই environment-এর Python ও package-ই active। Project switch-এ deactivate ও অন্যটা activate।। এক প্রজেক্টের package অন্যটাকে প্রভাবিত করবে না।
১) Version conflict: একই package-এর দু'টি version দু'টি প্রজেক্টে লাগে।
২) Global pollution: system Python-এ ১০০+ package — কোনটা কোন project-এর, ভুলে যাওয়া।
৩) Reproducibility: "আমার machine-এ কাজ করছে" — colleague-এর machine-এ ভেঙে যায়।
২ · venv বানানো ও ব্যবহার
Python ৩.৩+ এ venv built-in। কোনো install লাগে না। Project folder-এ গিয়ে:
# (১) Project folder-এ যান
mkdir my_ml_project
cd my_ml_project
# (২) venv বানান — .venv নাম convention
python -m venv .venv
# (৩) Activate করুন
# Linux / macOS:
source .venv/bin/activate
# Windows (PowerShell):
.venv\Scripts\Activate.ps1
# Windows (cmd):
.venv\Scripts\activate.bat
# (৪) prompt-এ (.venv) prefix দেখাবে — active নিশ্চিত
which python # .venv-এর ভিতরে point করবে
python -V # version
# (৫) কাজ শেষে
deactivate
.venv dotted — hidden, IDE auto-detect, git ignore সহজ। venv, env নামও দেখা যায় কিন্তু .venv Python community-র ২০২২+ standard।
৩ · pip — package install ও manage
pippip"Pip Installs Packages" — Python-এর default package manager। PyPI (Python Package Index)-এর ৫,০০,০০০+ package ঘর-বাড়ি। Python ৩.৪+ এ pre-installed। = Python Package Index (PyPI)-এর ৫ লক্ষ+ package ডাউনলোড ও install-এর tool। venv active থাকলে — pip শুধু সেই venv-এ install।
# Install — একটি package
pip install numpy
# Specific version
pip install "numpy==1.26.4"
# Range — নিরাপদ practice
pip install "numpy>=1.26,<2.0"
# Multiple একসাথে
pip install pandas matplotlib seaborn scikit-learn
# Upgrade
pip install --upgrade numpy
# List installed
pip list
# Detail of one package
pip show numpy
# Uninstall
pip uninstall numpy
# pip নিজেকে upgrade
python -m pip install --upgrade pip
৪ · requirements.txt — reproducible setup
Project share করার সময় — অন্যজন কীভাবে একই environment build করবে? requirements.txt-এ exact version লিখে রাখুন।
# (১) Current venv-এর package list ফাইল-এ
pip freeze > requirements.txt
# requirements.txt দেখতে এমন:
# numpy==1.26.4
# pandas==2.2.0
# scikit-learn==1.4.0
# (২) অন্যজন (বা CI/Docker) — same setup
python -m venv .venv
source .venv/bin/activate # বা Windows-এ Activate.ps1
pip install -r requirements.txt
# (৩) Curated version — top-level dependency only
# requirements.txt-এ লিখুন শুধু যা প্রয়োজন:
# numpy
# pandas>=2.0
# scikit-learn
# jupyterlab
# তারপর `pip install -r requirements.txt`
pip freeze সব transitive dependency সহ লেখে — ৫০-১০০ লাইন। Manual requirements.txt-এ শুধু top-level package রাখুন। সম্পূর্ণ reproducibility-র জন্য pip-compile (pip-tools) বা poetry/uv-র lock file।
৫ · .gitignore-এ venv
.venv/ folder-এ MB-GB জুড়ে binary — git-এ commit করবেন না। প্রকল্পের .gitignore-এ যোগ করুন:
# Python
__pycache__/
*.py[cod]
*$py.class
# Environment
.venv/
venv/
env/
# Jupyter
.ipynb_checkpoints/
# Secrets
.env
*.key
# Data (case-by-case)
data/raw/
*.csv.gz
৬ · conda — data science ecosystem
condacondaAnaconda Inc.-এর package + environment manager (২০১২)। Python-এর বাইরের C/C++/Fortran library handle (NumPy-র BLAS, OpenCV-র native code)। Miniconda — minimal install; Anaconda — ২৫০+ package pre-bundled। — pip-এর alternative। Python + non-Python (C/C++/CUDA) library একসাথে handle। Heavy data science (TensorFlow GPU, OpenCV, RAPIDS) — conda-তে সহজ।
# Miniconda install — যেকোনো OS-এ
# https://docs.conda.io/en/latest/miniconda.html
# নতুন env বানানো — Python version সহ
conda create -n ml python=3.11
# Activate
conda activate ml
# Package install — conda বা pip দু'টোই
conda install numpy pandas scikit-learn jupyterlab
pip install seaborn # PyPI থেকে যা conda-তে নেই
# List
conda list
# Save
conda env export > environment.yml
# Restore
conda env create -f environment.yml
# Deactivate
conda deactivate
৭ · আধুনিক tool — poetry, uv
-
poetry (২০১৮): dependency resolution + lock file + publish workflow।
pyproject.tomlstandard। Library author-দের প্রিয়। - pdm: poetry-র মতো, PEP 582 support।
- uv (Astral, ২০২৪): Rust-এ লেখা। pip-এর চেয়ে ১০-১০০× faster। venv + pip + pip-tools একই tool-এ। ২০২৬-এ rapidly adopt হচ্ছে।
# Install uv (একবার)
curl -LsSf https://astral.sh/uv/install.sh | sh
# (Windows: PowerShell-এ winget বা irm script)
# নতুন প্রজেক্ট
uv init my_project
cd my_project
# venv + dependency lock — এক command-এ
uv add numpy pandas scikit-learn
# Run script (auto-activate venv)
uv run python my_script.py
# Lock file — uv.lock auto-generated; reproducible
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।
প্র ০১ "Dependency hell" — ২০ বছরের পুরোনো সমস্যা। npm, Maven, Cargo — অন্য language-এ কীভাবে solve করা হয়েছে? Python কেন এত behind ছিল, এখন uv কেন এত excitement?
প্রতিটি programming language-এর dependency management-এর ইতিহাস — মূলত compromise-এর গল্প। Python ২০ বছরে ৭-৮টি tool-এর যুগ পেরিয়েছে। অন্য language-এর কাছ থেকে কী শেখা যায়?
অন্য ecosystem-এর সমাধান:
-
npm (Node.js, ২০১০): প্রতিটি project-এ
node_modules/— local install by default। Lock file (package-lock.json) reproducible। নেতিবাচক — duplicate dependency, GB-scale folder। -
Cargo (Rust, ২০১৫):
Cargo.toml+Cargo.lock। Single binary, dependency resolution mathematically sound। Rust-এর সবচেয়ে loved feature। -
Go modules (২০১৯):
go.mod+go.sum। Import path = source URL। সরল, যদিও late। - Maven (Java): XML-driven, repository-centric। Heavy কিন্তু rock-solid enterprise-এ।
-
Bundler (Ruby, ২০১০):
Gemfile+Gemfile.lock— modern lock-file pioneer।
Python-এর historical চ্যালেঞ্জ:
- Backward compat: ১৯৯১-এ designed Python — package management ১০ বছর পরে যোগ। Retrofit কঠিন।
- C extensions: NumPy, SciPy, OpenCV — pure Python নয়। Binary wheel build OS/architecture-specific।
- Installation site: System Python, user, venv — তিন level conflict।
- Tool fragmentation: distutils → setuptools → pip → pipenv → poetry → pdm → uv। Standard ছিল না।
-
No lock file standard:
requirements.txtincomplete; pip-tools, poetry, conda প্রতিটি own format।
২০১৫-২০২৩ improvements:
- PEP 517/518 —
pyproject.tomlstandard build config। - PEP 621 — project metadata standardized।
- pip-tools — lock file capability।
- poetry — modern UX।
- conda — non-Python dependency।
uv কেন breakthrough (২০২৪):
- Speed: Rust-এ written, parallel install। pip-এর ১০-১০০×। ১ minute install ১ second-এ।
- Unified tool: venv + pip + pip-tools + virtualenv + pipx — একটি tool।
- Resolver correctness: SAT-solver-based, modern algorithm।
- Python install too:
uv python install 3.12— pyenv-এর কাজও। - pip-compatible: existing requirements.txt কাজ করে। Drop-in replacement।
- Astral team: Ruff (linter)-এর creator — track record।
২০২৬-এ Python ecosystem এর state:
- uv rapidly adopted — major libraries CI-তে switching।
- poetry এখনো library author-দের জন্য ভাল।
- pip + venv → "default low-tech" থাকবে।
- conda — heavy data science niche।
- pyenv, pipenv — declining।
Python-এর strategic পাঠ:
- Tool fragmentation = community innovation, কিন্তু adoption বিভ্রান্তি।
- Performance matter বেশি — uv-এর success সেটার প্রমাণ।
- Standard slowly emerge — PEP-এর ধীর কিন্তু ক্যানোনিকাল।
- Inclusive tool wins — pip-compat = adoption সহজ।
মূল উপলব্ধি: Dependency management = software engineering-এর hardest unsolved problem (Russ Cox)। Python ২০ বছরে শিখেছে; uv-এর সাফল্য — speed + simplicity + standard compatibility। ২০২৬-এ নতুন প্রজেক্ট শুরু করলে — uv বেছে নিন; পুরোনো প্রজেক্টে — pip + venv ঠিক আছে। Tool বদলায়, principle (isolation, lock-file, reproducibility) থাকে।
প্র ০২
requirements.txt বনাম poetry.lock বনাম conda environment.yml — তিন format-এর pros/cons। কোন প্রজেক্টে কোনটা?
Reproducibility = ML production-এর foundation। কিন্তু "reproducible" শব্দটির মানে subtle। তিনটি format — তিন ধরনের reproducibility offer।
(১) requirements.txt — pip-এর native:
- Format: এক লাইনে এক package (
numpy==1.26.4)। - Pros:
- সর্বজনীন — pip আছে সব Python install-এ।
- সরল — text ফাইল, edit-friendly।
- CI/Docker integration trivial।
- Public knowledge — সব Python developer বুঝে।
- Cons:
- Platform-specific binary (Linux vs Mac vs Windows wheel) handle করে না।
- Resolver ছাড়া — transitive dependency conflict অলক্ষিত।
- Manual freeze: top-level package + transitive মেশানো।
- Hash verification optional — security risk।
- Best for: simple project, education, open-source library।
(২) poetry.lock (বা pdm.lock, uv.lock):
- Format: JSON/TOML — exact resolved tree, hash, source URL।
- Pros:
- Deterministic resolution — bit-by-bit reproducible।
- Multi-platform — Linux/Mac/Windows separate metadata।
- Hash verification — supply chain security।
- Top-level vs transitive — পরিষ্কার।
- Add/remove command-line — manual edit লাগে না।
- Cons:
- Tool install — extra step।
- Format opinionated — switching tool কষ্টকর।
- poetry-র resolver সময় বেশি নেয় (uv-তে দ্রুত)।
- Best for: production application, library publishing, team collaboration।
(৩) conda environment.yml:
- Format: YAML — channel + package + Python version + non-Python (CUDA, MKL)।
- Pros:
- Non-Python dependency handle (R, GDAL, FFmpeg, CUDA toolkit)।
- Cross-platform — Windows/Linux/Mac একই file।
- Heavy data science package binary — pre-built।
- Channel concept — conda-forge, bioconda — community-curated।
- Cons:
- Bigger install (Anaconda ~৩GB)।
- Slower than pip।
- conda-forge ecosystem PyPI-এর চেয়ে ছোট — সব package নেই।
- License (Anaconda Inc. — commercial use এ subscription)।
- environment.yml-এ pinned version exactness inconsistent।
- Best for: heavy data science (PyTorch CUDA, RAPIDS), bioinformatics, geospatial, mixed-language project।
সিদ্ধান্ত matrix:
- Library on PyPI publish → poetry/pdm + pyproject.toml।
- Web app, ML service prod → poetry.lock বা uv.lock।
- Quick research notebook → requirements.txt।
- GPU DL training → conda (CUDA convenience)।
- Academic reproducibility → conda environment.yml + Docker।
- Open-source teaching → requirements.txt (universal)।
Hybrid approach:
- conda — base environment (Python, CUDA)।
- pip — Python package (PyPI > conda-forge)।
- pip-tools বা uv — locking।
- একসাথে use — common practice production-এ।
Reproducibility levels:
- Level 1: requirements.txt — "মোটামুটি একই"।
- Level 2: lock file (poetry/uv) — "exact same Python tree"।
- Level 3: Docker image — "exact same OS + Python tree"।
- Level 4: Hash-pinned requirements.txt + Docker — supply chain secure।
মূল উপলব্ধি: "Reproducible" শব্দে ৪টি স্তর — যা প্রজেক্টের stake-এর সাথে match করুন। Open-source tutorial — Level 1 যথেষ্ট। Production ML — Level 2-3। Healthcare/financial — Level 4। Tool-এর গুরুত্ব কম, structured discipline-এর গুরুত্ব বেশি।
প্র ০৩ Production ML deployment-এ Docker কেন venv-এর চেয়ে preferred? Python application docker image build-এর best practice কী — multi-stage build, slim base, layer caching?
venv = Python isolation। Docker = OS isolation। Production deployment-এ Docker the gold standard — কারণ Python alone দিয়ে full reproducibility অসম্ভব।
venv-এর সীমা:
- OS-level dependency (libpng, ffmpeg, CUDA driver) handle করে না।
- Python version explicit না — system python-এর উপর dependent।
- Server config (env var, file system) capture না।
- Runtime কারো ১০টি OS package install করতে হবে — manual error-prone।
Docker কী solve করে:
- Base OS, Python version, system library, app code, environment — সব বুদ্ধিদীপ্ত image-এ।
- "Build once, run anywhere" — কোনো laptop থেকে production server পর্যন্ত।
- Versioned (tag):
my-ml:v1.2.3। - Rollback trivial — পুরোনো tag pull।
- K8s-native — Pod spec-এ image।
Best practice — minimal Dockerfile:
# Stage 1 — build
FROM python:3.11-slim AS builder
WORKDIR /app
# OS dependency (compile-time)
RUN apt-get update && apt-get install -y --no-install-recommends \
build-essential gcc \
&& rm -rf /var/lib/apt/lists/*
# Python deps — separate layer for caching
COPY requirements.txt .
RUN pip install --no-cache-dir --user -r requirements.txt
# Stage 2 — runtime (slim)
FROM python:3.11-slim
WORKDIR /app
# শুধু installed package copy — build tool বাদ
COPY --from=builder /root/.local /root/.local
ENV PATH=/root/.local/bin:$PATH
# App code (last layer — frequently change)
COPY src/ ./src/
# Non-root user — security
RUN useradd -m mluser && chown -R mluser /app
USER mluser
EXPOSE 8000
CMD ["python", "src/app.py"]
Best practice principles:
(১) Multi-stage build:
- Build stage — compiler, dev library, build artifact।
- Runtime stage — শুধু compiled binary। ৫০-৮০% image size কমে।
(২) Slim/Alpine base:
python:3.11-slim— ১২৫MB।python:3.11— ১GB।- Alpine আরও ছোট কিন্তু glibc difference — NumPy, scikit-learn-এ build issue। Slim-ই recommended।
(৩) Layer caching:
- requirements.txt আগে copy ও install — code change-এ pip install rerun হবে না।
- App code শেষে — frequently change, ছোট layer।
- একই layer-এ
apt-get update && apt-get install— cache problem এড়ান।
(৪) .dockerignore:
# .dockerignore
.git/
.venv/
__pycache__/
*.pyc
.pytest_cache/
data/
notebooks/
.env
(৫) Security:
- Non-root user।
- Pinned base image tag (
3.11-slimnot3-slim)। - SHA256 digest pin:
FROM python@sha256:... - Secret in env var, never bake-in।
- trivy বা snyk — CVE scan।
(৬) Size optimization:
--no-cache-dirpip install-এ।- Combine apt commands, clean apt list।
- Heavy ML — ONNX/quantize model।
- distroless image — extreme minimal।
(৭) GPU image:
- Base:
nvidia/cuda:12.1-runtime-ubuntu22.04+ Python install। - Or: PyTorch official
pytorch/pytorch:2.1.0-cuda12.1-cudnn8-runtime। - nvidia-container-toolkit host-এ।
Common ভুল:
- Whole repo COPY — secret leak, big image।
RUN apt-get update+RUN apt-get installseparate — old cache used।- Latest tag — non-reproducible।
- requirements.txt-এ unpinned — build-by-build difference।
- Root user — security exposure।
Modern alternatives:
- nix: functional deterministic build।
- Bazel/Buck: hermetic build for very large repo।
- devcontainer.json: VS Code dev environment in container।
- distroless: Google-র minimal images।
মূল উপলব্ধি: venv = development tool। Docker = deployment tool। ML production-এ — Docker without exception। Multi-stage + slim + layer caching — image ১GB থেকে ১০০MB। Build time ১০ minute থেকে ৩০ second। Production ML engineer-এর জন্য — Docker fluency mandatory।
প্র ০৪ Supply-chain attack — typo-squatting, malicious package, dependency confusion। PyPI-এ এই attack কীভাবে ঘটে? রক্ষার strategy কী — pin, hash, lock, audit?
২০১৭ থেকে — বছরে শত-শত malicious package PyPI/npm-এ পাওয়া যায়। One pip install-এ আপনার machine compromised — secret stolen, crypto miner, ransomware। ML developer-রা বিশেষভাবে target — ডেটা + compute + token।
সাধারণ attack vector:
(১) Typo-squatting:
- Real:
numpy। Fake:numpi,nummpy,nunpy। - Real:
tensorflow। Fake:tensorfllow,tensoflow। - One typo install → arbitrary code execution।
- ২০১৭ "pyrequest" (vs
requests) — bitcoin stealing। - ২০২০ "dateutils" (vs
python-dateutil) — credential exfiltration।
(২) Dependency confusion:
- Internal company package
company_utils। Public PyPI-এ একই নাম, higher version। pip default-এ public-কে prefer। - ২০২১ Alex Birsan — Apple, Microsoft, PayPal-এ এই attack POC।
(৩) Maintainer takeover:
- Old package maintainer abandon → attacker email pretend → access।
- "event-stream" npm (২০১৮) — bitcoin wallet steal।
colorsnpm (২০২২) — maintainer নিজেই corrupt code push।
(৪) Compromised CI/CD:
- GitHub Actions secret leak → automated malicious release।
- SolarWinds attack (২০২০) — supply chain gold standard fear।
(৫) Post-install script:
setup.py-এ arbitrary code → install time-এ run।pip install= arbitrary code execution। Don't install random package।
রক্ষার strategy:
(১) Version pin + hash:
# requirements.txt with hash
numpy==1.26.4 \
--hash=sha256:9...abcd \
--hash=sha256:5...wxyz
# pip-compile --generate-hashes-এ auto
- Hash mismatch → install fail।
- Tampered package detect।
(২) Lock file:
- poetry.lock, uv.lock — exact tree।
- Transitive dependency-ও pin।
(৩) Private index:
- Internal package internal index-এ।
pip install --index-url=https://internal.pypi/- Dependency confusion এড়ানো।
(৪) Audit tools:
pip-audit— known vulnerability check।safety check— CVE scan।snyk— premium scanner।- GitHub Dependabot — auto PR for updates।
(৫) Sandboxing:
- Untrusted package — Docker container।
- Production secret never in dev environment।
- Least privilege — application-specific role।
(৬) Verify before install:
- Package name carefully spell।
- PyPI page check — release count, github star, last update।
- "Sponsored" search result থেকে install না।
- Suspicious — package size 5KB (no real code) → suspicious।
(৭) PyPI 2FA mandatory (২০২৪+):
- Top maintainer-দের forced 2FA।
- Trusted publishing (OIDC) — CI থেকে keyless publish।
(৮) SBOM (Software Bill of Materials):
- Project-এর exact dependency tree document।
- CycloneDX, SPDX format।
- Compliance + incident response।
Real incident — কী থেকে শিখি:
- ২০২৩
pytorch-nightlydependency confusion — torchtriton package compromised। - ২০২৪ ultralytics (YOLO) — crypto miner injected।
- প্রতিবছর ৫-১০টি public ML library affected।
ML-specific risk:
- Model file (pickle) — arbitrary code on load। Use safetensors বা ONNX।
- Pretrained weight from random source — backdoor possible।
- Hugging Face Hub — verify maintainer।
- Notebook থেকে copy-paste install — typo বেশি।
সম্পূর্ণ defense layered approach:
- Trusted source only (PyPI verified, big maintainer)।
- Pinned + hash-locked requirements।
- pip-audit / Dependabot auto।
- Private index-এ internal package।
- 2FA + signed commit on publishing।
- Production isolated network।
- Regular SBOM review।
মূল উপলব্ধি: "pip install foo" = arbitrary code execution। ML developer-এর responsibility — যা install করছেন, যাচাই। ১% extra effort = ১০০× incident cost কম। Tooling helps, কিন্তু human judgment irreplaceable। সাবধানতা = professional habit।
অনুশীলন
-
প্রজেক্ট তৈরি: নতুন folder
iris_projectবানান। venv তৈরি করুন, activate করুন, pandas + scikit-learn install করুন।requirements.txtgenerate করুন।mkdir iris_project && cd iris_project python -m venv .venv # Linux/Mac source .venv/bin/activate # Windows # .venv\Scripts\Activate.ps1 pip install pandas scikit-learn jupyter pip freeze > requirements.txt cat requirements.txt -
Reproduce: উপরের project delete করুন (
rm -rf .venv)।requirements.txtদিয়ে নতুন venv বানিয়ে restore করুন।rm -rf .venv python -m venv .venv source .venv/bin/activate # Windows-এ Activate.ps1 pip install -r requirements.txt pip list # verify -
uv try করুন: uv install করুন এবং
uv addদিয়ে একই package install — pip-এর তুলনায় কত দ্রুত?# uv install (Linux/Mac) curl -LsSf https://astral.sh/uv/install.sh | sh # নতুন project mkdir test_uv && cd test_uv uv init time uv add pandas scikit-learn jupyter # Compare with pip: # rm -rf ..venv && python -m venv .venv && source .venv/bin/activate && time pip install pandas scikit-learn jupyterসাধারণত uv ১০-৫০× দ্রুত। বড় package (PyTorch CUDA) — পার্থক্য আরো বেশি।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- পাঠ ২৩ · Git ও GitHub-এ AI প্রজেক্ট পরবর্তী পাঠ Project setup-এর পরের ধাপ — version control।
- পাঠ ২১ · EDA — Iris ডেটাসেটে আগের পাঠ EDA-র workflow — venv-এই চালান।
- পাঠ ১৯ · Jupyter Notebook ও Colab এই পাঠের সাথে সম্পর্কিত Local Jupyter ব্যবহার করতে — venv-এই install।
- সব AI Courses দেখুন ABCL TECH Python, ML, DL, NLP, CV, GenAI, RL, MLOps — সব AI কোর্স একসাথে।
!pip install -r requirements.txt চালান।