অধ্যায় 1 · আপনার ডেভেলপার টুলবক্স
এনভায়রনমেন্ট ভেরিয়েবল, .env ফাইল ও ভার্চুয়াল এনভায়রনমেন্ট
- পৃষ্ঠা 3 / 22
- 14 মিনিট পড়া
একটা AI অ্যাপ্লিকেশনের এমন কিছু সেটিং লাগে, যা কোডের ভেতরে লেখা চলে না: LLM প্রোভাইডারের API কি, মডেলের নাম, ডেটাবেসের URL, ডিবাগ চালু-বন্ধের সুইচ। আবার প্যাকেজগুলোর ঠিক সংস্করণও লাগে — আপনার কোড যে FastAPI আর requests দিয়ে পরীক্ষা করা হয়েছে সেগুলো, পাশের ল্যাপটপে যা ইনস্টল করা আছে তা নয়। এই পাতায় দুটোই আছে: সেটিং আর সিক্রেটের জন্য এনভায়রনমেন্ট ভেরিয়েবল ও .env ফাইল, আর প্যাকেজের জন্য ভার্চুয়াল এনভায়রনমেন্ট — প্রথমে প্রচলিত venv + pip দিয়ে, তারপর uv দিয়ে, ২০২৬ সালে বেশিরভাগ নতুন Python প্রজেক্ট যে দ্রুত টুলটা ব্যবহার করে।
একবার এটা ঠিকমতো শিখে নিলে নতুনদের সবচেয়ে সাধারণ দুটো বিপর্যয় এড়াতে পারবেন: GitHub-এ পুশ হয়ে যাওয়া API কি, আর "আমার মেশিনে তো চলে"।
যা শিখবেন
- এনভায়রনমেন্ট ভেরিয়েবল কী, শেলে কীভাবে সেট করবেন (
export,$VAR) আর Python-এ কীভাবে পড়বেন (os.environ) PATHকী, আর একটা প্রোগ্রামের নাম টাইপ করলে শেল সেটা কীভাবে খুঁজে পায়- সিক্রেট কীভাবে একটা
.envফাইলে রাখবেন আর python-dotenv দিয়ে লোড করবেন - Python আর Git কীভাবে ইনস্টল ও যাচাই করবেন, ভার্চুয়াল এনভায়রনমেন্ট বানাবেন, আর প্যাকেজগুলো
requirements.txt-এ লিখে রাখবেন - একই কাজ uv দিয়ে কীভাবে করবেন (
uv init,uv add,uv run,pyproject.toml,uv.lock), আর প্রজেক্ট ফোল্ডার কীভাবে সাজাবেন
এনভায়রনমেন্ট ভেরিয়েবল
চলমান প্রতিটা প্রোগ্রাম সাথে নিয়ে চলে লেখা-সেটিংয়ের একটা ছোট ডিকশনারি, যার নাম তার এনভায়রনমেন্ট (environment)। শেলের একটা আছে, আর শেল থেকে যে প্রোগ্রামই চালান, সেটা এর একটা কপি পায়। কয়েকটা আপনার জন্য আগে থেকেই সেট করা থাকে:
echo "$HOME"
echo "$USER"/home/nadia
nadiaকমান্ড চলার আগে $NAME-এর জায়গায় ভেরিয়েবলের মান বসে যায়। এবার নিজের একটা বানান। এখানে একটা সূক্ষ্ম পার্থক্য আছে: শেল ভেরিয়েবল (শুধু শেল জানে) আর এনভায়রনমেন্ট ভেরিয়েবল (প্রোগ্রামগুলোর কাছেও যায়); export প্রথমটাকে দ্বিতীয়টায় পরিণত করে:
MODEL_NAME=practice-llm-1
echo "$MODEL_NAME"
python3 -c 'import os; print(os.environ.get("MODEL_NAME"))'
export MODEL_NAME
python3 -c 'import os; print(os.environ.get("MODEL_NAME"))'practice-llm-1
None
practice-llm-1export-এর আগে Python দেখেছে None: ভেরিয়েবলটা ছিল শুধু শেলের ভেতরে। এরপর এই শেল থেকে চালানো প্রতিটা প্রোগ্রাম এটা দেখতে পায়। সাধারণত দুটো কাজ একসাথে করা হয় export NAME=value দিয়ে। bash-এর দুটো নিয়ম মনে রাখুন: =-এর দুপাশে কোনো স্পেস নয়, আর মানে স্পেস থাকলে উদ্ধৃতিচিহ্ন দিন (export GREETING="hello there")।
শুধু একটা কমান্ডের জন্যও ভেরিয়েবল সেট করা যায়, কমান্ডের সামনে লিখে:
LOG_LEVEL=debug python3 -c 'import os; print(os.environ["LOG_LEVEL"])'
echo "after: ${LOG_LEVEL:-not set}"debug
after: not set${LOG_LEVEL:-not set} মানে "মানটা, আর কোনো মান না থাকলে not set"। export দিয়ে সেট করা ভেরিয়েবল টার্মিনাল বন্ধ করা পর্যন্ত থাকে; স্থায়ীভাবে রাখতে চাইলে export লাইনটা ~/.bashrc-এ (bash, Git Bash, WSL) বা ~/.zshrc-এ (macOS) যোগ করুন।
Python-এ পড়া
Python-এ এনভায়রনমেন্ট হলো os.environ, যা স্ট্রিংয়ের একটা ডিকশনারির মতো আচরণ করে:
import os
print(os.environ["MODEL_NAME"]) # থাকতেই হবে, নইলে KeyError
print(os.getenv("TEMPERATURE", "0.2")) # না থাকলে একটা ডিফল্ট মান
max_tokens = int(os.getenv("MAX_TOKENS", "256")) # মান সবসময় টেক্সট: রূপান্তর করে নিন
print(max_tokens + 1)
print(os.environ["LLM_API_KEY"])practice-llm-1
0.2
257
KeyError: 'LLM_API_KEY'কোন ধরনটা ব্যবহার করবেন, সেটা ডিজাইনের সিদ্ধান্ত। যার একটা যুক্তিসঙ্গত ডিফল্ট আছে (temperature, লগ লেভেল), তার জন্য os.getenv(name, default)। যা ছাড়া অ্যাপ চলতেই পারে না (API কি, ডেটাবেসের URL), তার জন্য os.environ[name] — অ্যাপ চালু হয়ে প্রথম ইউজারের রিকোয়েস্টে ফেল করার চেয়ে শুরুতেই পরিষ্কার একটা এরর দিয়ে থেমে যাওয়া ভালো। পরে FastAPI-তে যেসব সেটিংস ক্লাস দেখবেন, সেগুলোর পেছনের ভাবনা এটাই।
PATH: শেল কীভাবে প্রোগ্রাম খুঁজে পায়
git টাইপ করলে শেল পুরো ডিস্ক খোঁজে না। PATH ভেরিয়েবলে যে ফোল্ডারগুলোর তালিকা আছে, সেগুলোতে ক্রম অনুযায়ী খোঁজে, আর git নামের প্রথম যে ফাইলটা পায় সেটাই চালায়। কোন ফাইলটা, তা দেখায় command -v। নিজেদের একটা ছোট্ট প্রোগ্রাম লিখে দেখি PATH কীভাবে কাজ করে:
mkdir -p ~/bin
cat > ~/bin/hello-ai <<'EOF'
#!/usr/bin/env bash
echo "Hello from a script on your PATH"
EOF
chmod +x ~/bin/hello-ai
command -v git
command -v hello-ai || echo "hello-ai is not on the PATH"/usr/bin/git
hello-ai is not on the PATHস্ক্রিপ্টটা আছে, আর chmod +x সেটাকে চালানোর উপযোগী করেছে, কিন্তু শেল যেসব ফোল্ডারে খোঁজে, ~/bin তার একটা নয়। এটাকে PATH-এর একদম সামনে বসান (ফোল্ডারগুলো : দিয়ে আলাদা):
export PATH="$HOME/bin:$PATH"
echo "$PATH" | tr ':' '\n' | head -n 1
command -v hello-ai
hello-ai/home/nadia/bin
/home/nadia/bin/hello-ai
Hello from a script on your PATHPython, Git বা uv ইনস্টল করলে পর্দার আড়ালে ঠিক এটাই ঘটে: ইনস্টলার তার ফোল্ডারটা PATH-এ বসিয়ে দেয়। ইনস্টলের ঠিক পরেই "command not found" মানে প্রায় সবসময় ফোল্ডারটা এখনো PATH-এ আসেনি (আগে একটা নতুন টার্মিনাল খুলুন — শেল চালু হওয়ার সময় PATH পড়ে)। আর ভুল Python চললে command -v python দেখিয়ে দেয় কোনটা জিতেছে।
Python আর Git ইনস্টল ও যাচাই
| সিস্টেম | Python | Git |
|---|---|---|
| Windows | python.org থেকে। সাম্প্রতিক রিলিজে আছে Python install manager, যা আপনাকে py কমান্ড দেয় (py install 3.14)। পুরোনো ধরনের ইনস্টলার হলে "Add python.exe to PATH" টিক দিন। | winget install --id Git.Git -e --source winget, অথবা git-scm.com থেকে ইনস্টলার। এর সাথে Git Bash-ও আসে। |
| macOS | brew install python@3.14 (Homebrew), অথবা python.org-এর ইনস্টলার | xcode-select --install (Apple-এর Git) বা brew install git |
| Ubuntu / WSL | sudo apt install python3 python3-venv python3-pip | sudo apt install git |
এই কোর্স Python 3.14-কে মান হিসেবে ধরে; প্রতিটা উদাহরণ 3.12 আর 3.13-তেও চলে, তাই আপনার ডিস্ট্রিবিউশনের Python 3.12+ হলেই চলবে। Python 3.15 এসেছে ২০২৬-এর অক্টোবরে, কিন্তু কিছু প্যাকেজ আর Docker ইমেজের তাল মেলাতে কয়েক সপ্তাহ লাগে। Git-এর ক্ষেত্রে 2.51 বা তার পরের যেকোনো সংস্করণে এই কোর্সের সব কমান্ড আছে। আপনার কাছে কী আছে দেখে নিন:
python3 --version
git --versionদেখবেন Python 3.14.8 আর git version 2.56.0-এর মতো কিছু, সংখ্যাগুলো আপনার নিজের। স্ক্রিপ্টে ব্যবহার করার মতো একটা সংস্করণ-যাচাই:
python3 -c 'import sys; print("Python OK" if sys.version_info >= (3, 12) else "Please install Python 3.12+")'Python OKWindows-এ কমান্ডটা
python3-এর বদলেpythonবাpyহতে পারে।pythonটাইপ করলে যদি Microsoft Store খুলে যায়, তাহলে Windows একটা নকল শর্টকাট ("app execution alias") ব্যবহার করছে: Python ঠিকমতো ইনস্টল করুন, অথবা Settings → Apps → Advanced app settings → App execution aliases-এ গিয়ে অ্যালিয়াসটা বন্ধ করুন।
venv আর pip দিয়ে ভার্চুয়াল এনভায়রনমেন্ট
প্রতিটা প্রজেক্ট যদি একই শেয়ার করা Python-এ প্যাকেজ ইনস্টল করে, তাহলে আগে বা পরে দেখা যাবে প্রজেক্ট A-র লাগবে requests 2.34, আর তাতে পুরোনো প্রজেক্ট B ভেঙে পড়ছে। ভার্চুয়াল এনভায়রনমেন্ট (virtual environment) হলো একটা ফোল্ডার, যাতে একটা প্রজেক্টের নিজস্ব প্যাকেজগুলো থাকে, একটা Python ইন্টারপ্রেটারের সাথে যুক্ত। প্রজেক্টের ভেতরে .venv নামে (প্রচলিত নাম) একটা বানান, আর সেটা অ্যাক্টিভেট করুন:
mkdir -p ~/projects/hello-ai
cd ~/projects/hello-ai
python3 -m venv .venv
source .venv/bin/activate
command -v python
python -c 'import sys; print("inside a venv:", sys.prefix != sys.base_prefix)'/home/nadia/projects/hello-ai/.venv/bin/python
inside a venv: Trueঅ্যাক্টিভেট করায় কোনো জাদু নেই: এটা .venv/bin-কে আপনার PATH-এর সামনে বসিয়ে দেয় — আগের অংশের কৌশলটাই — তাই এখন python আর pip মানে .venv-এর ভেতরেরগুলো। মনে করিয়ে দিতে আপনার প্রম্পটে সাধারণত (.venv) দেখায়। এবার এতে প্যাকেজ ইনস্টল করুন। শুধু pip না লিখে python -m pip লিখুন, যাতে pip ঠিক সেই Python-এই ইনস্টল করে যেটা আপনি চালাচ্ছেন:
python -m pip install -q requests python-dotenv
python -m pip freeze > requirements.txt
cat requirements.txtcertifi==2026.7.22
charset-normalizer==3.5.2
idna==3.20
python-dotenv==1.2.4
requests==2.34.2
urllib3==2.8.0pip freeze ইনস্টল করা প্রতিটা প্যাকেজ তার নির্দিষ্ট সংস্করণসহ তালিকা করে, requests নিজে থেকে যেগুলো টেনে এনেছে সেগুলোসহ (certifi, idna, urllib3, charset-normalizer)। requirements.txt হিসেবে সেভ করে কোডের সাথে কমিট করলে যে কেউ হুবহু একই এনভায়রনমেন্ট আবার বানাতে পারে:
python -m pip install -q -r requirements.txtকাজ শেষে deactivate চালালে .venv/bin আবার PATH থেকে সরে যায় (একটু পরেই এটা করবেন)। .venv ফোল্ডারটা নিজে কখনো শেয়ার বা কমিট করা হয় না — এটা কয়েকশো মেগাবাইটের হতে পারে, আর শুধু যে মেশিনে বানানো সেখানেই চলে। যখন খুশি মুছে ফেলুন, আর requirements.txt থেকে আবার বানিয়ে নিন।
| কাজ | bash (Linux, macOS, WSL) | Windows-এ Git Bash | PowerShell |
|---|---|---|---|
| venv অ্যাক্টিভেট | source .venv/bin/activate | source .venv/Scripts/activate | .venv\Scripts\Activate.ps1 |
| ভেরিয়েবল সেট | export MODEL_NAME=practice-llm-1 | bash-এর মতোই | $env:MODEL_NAME = "practice-llm-1" |
| ভেরিয়েবল পড়া | echo "$MODEL_NAME" | bash-এর মতোই | echo $env:MODEL_NAME |
| সবগুলোর তালিকা | env | env | Get-ChildItem Env: |
PowerShell যদি Activate.ps1 চালাতে না দেয় ("running scripts is disabled on this system"), তাহলে একবার Set-ExecutionPolicy -Scope CurrentUser RemoteSigned দিয়ে লোকাল স্ক্রিপ্ট চালানোর অনুমতি দিন।
.env ফাইলে সিক্রেট
প্রতিবার টার্মিনাল খুলে export লাইন টাইপ করা দ্রুতই বিরক্তিকর হয়ে ওঠে। লোকাল ডেভেলপমেন্টে প্রচলিত সমাধান হলো প্রজেক্ট ফোল্ডারে একটা .env ফাইল, প্রতি লাইনে একটা NAME=value, যা লোড করে এইমাত্র ইনস্টল করা python-dotenv প্যাকেজ। ফাইলটা বানান, আর সাথে একটা ছোট প্রোগ্রাম, যা এর সেটিংগুলো পড়ে:
cd ~/projects/hello-ai
cat > .env <<'EOF'
# Local settings for hello-ai. Never commit this file.
LLM_API_KEY=pk-practice-1234567890abcdef
MODEL_NAME=practice-llm-1
TEMPERATURE=0.2
EOF# file: settings_demo.py
import os
from dotenv import load_dotenv
load_dotenv() # .env পড়ে; আগে থেকে সেট করা ভেরিয়েবলই জেতে
model = os.getenv("MODEL_NAME", "practice-llm-1")
temperature = float(os.getenv("TEMPERATURE", "0.7"))
api_key = os.environ["LLM_API_KEY"]
print(f"model={model} temperature={temperature}")
print(f"api key: {api_key[:3]}...{api_key[-4:]} ({len(api_key)} characters)")source .venv/bin/activate
python settings_demo.py
MODEL_NAME=bigger-model python settings_demo.py
deactivatemodel=practice-llm-1 temperature=0.2
api key: pk-...cdef (28 characters)
model=bigger-model temperature=0.2
api key: pk-...cdef (28 characters)তিনটা জিনিস খেয়াল করুন:
- প্রোগ্রামটা কখনো পুরো কি প্রিন্ট করে না, শুধু চেনার মতো যতটুকু দরকার। লগ অনেক জায়গায় পৌঁছায় (টার্মিনাল, লগ সার্ভিস, চ্যাটে পাঠানো স্ক্রিনশট); লগে পুরো কি মানেই ফাঁস হয়ে যাওয়া কি।
- আসল এনভায়রনমেন্টে আগে থেকে সেট করা ভেরিয়েবল
.env-এর ওপর জেতে (python-dotenv-এর ডিফল্ট এটাই)। তাই.envআপনার ল্যাপটপের জন্য; সার্ভারে বা Docker-এ আসল এনভায়রনমেন্ট ভেরিয়েবল সেট করেন, আর একই কোড সেগুলো তুলে নেয়। .envকখনোই Git বা GitHub-এ যাবে না। .gitignore: সিক্রেট আর অপ্রয়োজনীয় ফাইল বাইরে রাখা পাতায় দেখবেন Git-কে দিয়ে কীভাবে এটা উপেক্ষা করাবেন, আর কীভাবে একটা.env.exampleশেয়ার করবেন, যাতে ভেরিয়েবলের নাম থাকে কিন্তু মান থাকে না।
uv: প্রজেক্ট সামলানোর আধুনিক উপায়
uv (Ruff লিন্টারের নির্মাতা Astral-এর তৈরি) venv, pip আর আরও কিছুর কাজ একটাই দ্রুত টুলে করে, আর FastAPI-র নিজের ডকুমেন্টেশনও এটাই ব্যবহার করে। এটা প্রজেক্ট সামলায় pyproject.toml দিয়ে — যে প্রচলিত ফাইলে একটা Python প্রজেক্ট তার নাম, Python সংস্করণ আর ডিপেন্ডেন্সি ঘোষণা করে। একবার ইনস্টল করে নিন:
curl -LsSf https://astral.sh/uv/install.sh | shWindows-এ ব্যবহার করুন winget install --id astral-sh.uv -e (অথবা powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex")। একটা নতুন টার্মিনাল খুলুন, uv --version একটা সংস্করণ দেখাবে (লেখার সময় 0.13; uv এখনো 0.x, তাই CI-তে এর সংস্করণ নির্দিষ্ট করে দেওয়া ভালো)। এবার একটা প্রজেক্ট বানান:
cd ~/projects
uv init --no-package hello-uv
cd hello-uv
ls -aInitialized project `hello-uv` at `/home/nadia/projects/hello-uv`
.
..
.git
.gitignore
.python-version
README.md
main.py
pyproject.tomluv init লিখেছে শুরুর একটা main.py, একটা README.md, একটা pyproject.toml, কোন Python সংস্করণ ব্যবহার হবে তা লেখা একটা .python-version ফাইল, আর আপনার হয়ে git init-ও চালিয়ে দিয়েছে (.git, .gitignore) — এগুলো কী, পরের পাতায় শিখবেন। --no-package চায় একটা সাধারণ অ্যাপ্লিকেশন, যা main.py দিয়ে চালান; এটা না দিলে uv 0.13 প্রজেক্টটাকে ইনস্টলযোগ্য প্যাকেজ হিসেবে সাজায়, কোড থাকে src/-এর নিচে — লাইব্রেরির জন্য সেটাই চাই, কিন্তু ছোট একটা অ্যাপের জন্য তা বাড়তি।
প্যাকেজ যোগ করুন uv add দিয়ে:
uv add -q requests python-dotenv
cat pyproject.toml
ls -a[project]
name = "hello-uv"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.12"
dependencies = [
"python-dotenv>=1.2.4",
"requests>=2.34.2",
]
.
..
.git
.gitignore
.python-version
.venv
README.md
main.py
pyproject.toml
uv.lockএকটা কমান্ডই .venv বানিয়েছে (অ্যাক্টিভেট করার দরকার নেই), প্যাকেজগুলো ইনস্টল করেছে, pyproject.toml-এ সর্বনিম্ন সংস্করণসহ সেগুলো লিখেছে, আর পরোক্ষগুলোসহ প্রতিটা প্যাকেজের নির্দিষ্ট সংস্করণ লিখে রেখেছে uv.lock-এ। requires-python লাইনে আছে uv যে Python সংস্করণ পেয়েছে সেটা; আপনার মেশিনে সম্ভবত 3.14 লেখা থাকবে। uv run প্রজেক্টের এনভায়রনমেন্টের ভেতরে একটা কমান্ড চালায়, কিছু বাদ পড়ে থাকলে আগে সেটা মিলিয়ে (sync) নেয়:
uv run main.py
uv run python -c 'import requests; print("requests", requests.__version__)'Hello from hello-uv!
requests 2.34.2প্রজেক্টটা ক্লোন করে একজন সহকর্মী uv sync চালালেই পান uv.lock-এ লেখা হুবহু সংস্করণগুলো। pyproject.toml আর uv.lock কমিট করুন; .venv কখনো নয়।
| কাজ | venv + pip | uv |
|---|---|---|
| প্রজেক্ট শুরু | mkdir + python -m venv .venv | uv init name |
| প্যাকেজ যোগ | python -m pip install requests | uv add requests |
| শুধু ডেভেলপমেন্টের টুল যোগ | (আলাদা একটা requirements ফাইল) | uv add --dev pytest |
| নির্দিষ্ট সংস্করণ লিখে রাখা | pip freeze > requirements.txt | নিজে থেকেই: uv.lock |
| এনভায়রনমেন্ট আবার বানানো | python -m pip install -r requirements.txt | uv sync |
| স্ক্রিপ্ট চালানো | অ্যাক্টিভেট, তারপর python app.py | uv run app.py |
কোনটা ব্যবহার করবেন? দুটোই শিখুন। venv আর pip Python-এর সাথেই আসে, সব টুল আর টিউটোরিয়াল এগুলো বোঝে, আর আগের কোর্সগুলোতে এগুলোই ব্যবহার হয়েছে। uv বেশি দ্রুত, ঠিকঠাক একটা লক ফাইল রাখে, আর নতুন প্রজেক্টে এটাই ডিফল্ট (২০২৬-এর মার্চে OpenAI ঘোষণা করেছে যে তারা Astral কিনছে, আর uv ওপেন সোর্স রাখার প্রতিশ্রুতি দিয়েছে)। আপনার প্রথম FastAPI অ্যাপ থেকে এই কোর্স আগে uv দেখাবে, পাশে pip-এর সমতুল্য কমান্ড। একটা প্রজেক্টের ভেতরে একটা বেছে নিয়ে সেটাতেই থাকুন।
বড় হলেও গোছানো থাকে এমন প্রজেক্ট ফোল্ডার
বেশিরভাগ ছোট AI ব্যাকএন্ডের জন্য কাজ করে এমন একটা বিন্যাস, আর এই কোর্সের প্রজেক্ট ধীরে ধীরে এই রূপই নেবে:
hello-ai/
├── .venv/ the virtual environment (never committed)
├── .env real settings and secrets (never committed)
├── .env.example variable names, no values (committed)
├── .gitignore what Git should not track
├── pyproject.toml project and dependencies (or requirements.txt)
├── uv.lock exact versions (committed)
├── README.md what it is and how to run it
├── app/ the application code
│ └── main.py
├── tests/ automated tests
├── data/ datasets (usually not committed)
└── notebooks/ experimentsকোড, কনফিগারেশন আর ডেটা আলাদা রাখুন, সিক্রেট রাখুন শুধু এনভায়রনমেন্টে, আর প্রতিটা প্রজেক্ট যেন কমিট করা জিনিস থেকেই হুবহু আবার বানানো যায়। এই কোর্সের শেষে Docker আর ডিপ্লয়মেন্টে এই তিনটা অভ্যাস সরাসরি কাজে লাগবে।
AI আর ব্যাকএন্ডের কাজে এগুলো কোথায় লাগে
- LLM API কি (OpenAI, Anthropic, Gemini) অফিশিয়াল SDK-গুলো পড়ে এনভায়রনমেন্ট ভেরিয়েবল থেকে, যেমন
OPENAI_API_KEYআরANTHROPIC_API_KEY। - টুয়েলভ-ফ্যাক্টর কনফিগারেশন: একই ইমেজ চলে ডেভেলপমেন্ট, স্টেজিং আর প্রোডাকশনে; আলাদা শুধু এনভায়রনমেন্ট (ডেটাবেসের URL, মডেলের নাম, লগ লেভেল)।
- পুনরায় করা যায় এমন এক্সপেরিমেন্ট: লক ফাইল লিখে রাখে scikit-learn বা PyTorch-এর কোন সংস্করণে একটা ফলাফল এসেছিল, যাতে মাস কয়েক পরেও সেটা আবার পাওয়া যায়।
- হোস্টিং প্ল্যাটফর্ম (Render, Cloud Run, GitHub Actions) — সবগুলোতেই একটা "secrets" বা "environment variables" পাতা আছে, যা ঠিক এই ভেরিয়েবলগুলোই আপনার অ্যাপকে দেয়।
সাধারণ ভুল
- ভুল Python-এ ইনস্টল করা। venv অ্যাক্টিভ না থাকলে
pip installঅন্য কোথাও ইনস্টল করে, তারপরimport requestsফেল করেModuleNotFoundErrorদিয়ে। venv অ্যাক্টিভেট করুন (বাuv runব্যবহার করুন), আরcommand -v pythonদিয়ে যাচাই করুন। =-এর দুপাশে স্পেস। bash-এexport MODEL_NAME = xএকটা এরর। লিখুনexport MODEL_NAME=x।- মানগুলো যে স্ট্রিং, তা ভুলে যাওয়া।
os.getenv("MAX_TOKENS")হলো"256",256নয়; আরos.getenv("DEBUG")হলো"false"— যা খালি নয় এমন স্ট্রিং, তাইif-এ সত্য। স্পষ্টভাবে রূপান্তর করুন। - সিক্রেট কোডে লিখে রাখা বা কমিট করা।
main.py-তে বা কমিট করা.env-এ থাকা কি পুশ করার মুহূর্তেই পাবলিক। এটা.env-এ রাখুন, ফাইলটা ইগনোর করান, আর ফাঁস হওয়া যেকোনো কি বদলে (rotate) ফেলুন। .venvকমিট করা। এটা বড় আর নির্দিষ্ট মেশিনের জন্য। এর বদলেrequirements.txt, অথবাpyproject.toml+uv.lockকমিট করুন।
নিজে চেষ্টা করুন
- সহজ:
BATCH_SIZE=32ভেরিয়েবলটা export করুন আর Python থেকে এর দ্বিগুণ প্রিন্ট করুন (সাবধান: এটা আসে টেক্সট হিসেবে)। - মাঝারি:
~/projects/hello-ai-এ.envথেকে সব মান মুছে (নামগুলো আর কমেন্ট রেখে).env.exampleবানান, একটাইsedকমান্ড দিয়ে:sed 's/=.*/=/'। - কঠিন:
hello-uvপ্রজেক্টে pytest-কে ডেভেলপমেন্ট ডিপেন্ডেন্সি হিসেবে যোগ করুন, আরpyproject.toml-এর যে অংশে uv এটা লিখেছে সেটা দেখান। তারপরuv run pytest --versionচালান।
উত্তর
১. হিসাবের আগে int() দিয়ে রূপান্তর করুন; না করলে "32" * 2 হয়ে যেত "3232":
export BATCH_SIZE=32
python3 -c 'import os; print(int(os.environ["BATCH_SIZE"]) * 2)'64২. sed প্রতিটা লাইনের প্রথম = থেকে শেষ পর্যন্ত সবকিছু বদলে দেয়; কমেন্ট লাইনে কোনো = নেই, তাই সেটা থেকে যায়:
cd ~/projects/hello-ai
sed 's/=.*/=/' .env > .env.example
cat .env.example# Local settings for hello-ai. Never commit this file.
LLM_API_KEY=
MODEL_NAME=
TEMPERATURE=৩. --dev প্যাকেজটাকে একটা dev ডিপেন্ডেন্সি গ্রুপে রাখে, যা ডেভেলপমেন্টে ইনস্টল হয় কিন্তু প্রোডাকশনের ইনস্টলে বাদ থাকে:
cd ~/projects/hello-uv
uv add -q --dev pytest
tail -n 4 pyproject.toml
uv run pytest --version[dependency-groups]
dev = [
"pytest>=9.1.1",
]
pytest 9.1.1সারসংক্ষেপ
- এনভায়রনমেন্ট ভেরিয়েবল হলো লেখা-সেটিং, যা একটা প্রোগ্রাম উত্তরাধিকার সূত্রে পায়;
export NAME=valueসেট করে, bash-এ$NAMEআর Python-এos.environ/os.getenvপড়ে। PATHহলো ফোল্ডারের তালিকা, যেখানে শেল প্রোগ্রাম খোঁজে; ইনস্টলার আর venv অ্যাক্টিভেশন এটা বদলেই কাজ করে। কোনটা চলবে, দেখায়command -v।- সিক্রেট রাখুন
.env-এ, python-dotenv দিয়ে লোড করুন, কখনো প্রিন্ট বা কমিট করবেন না; আসল এনভায়রনমেন্ট ভেরিয়েবল জেতে, আর সার্ভার এভাবেই একই কোড কনফিগার করে। - ভার্চুয়াল এনভায়রনমেন্ট প্রতিটা প্রজেক্টকে নিজের প্যাকেজ দেয়:
python -m venv .venv, অ্যাক্টিভেট,python -m pip install,pip freeze > requirements.txt। - uv সবটা একটা টুলেই করে:
uv init,uv add,uv run; ডিপেন্ডেন্সি থাকেpyproject.toml-এ, নির্দিষ্ট সংস্করণuv.lock-এ।
এরপর: ভার্সন কন্ট্রোল ও আপনার প্রথম রিপোজিটরি পাতায় Git-এর সাথে পরিচয়: Git কনফিগার করবেন, একটা প্রজেক্ট ফোল্ডারকে রিপোজিটরিতে পরিণত করবেন, আর প্রথম কমিট করবেন।