Moduli na pakiti za Python: import, pip, venv na maktaba kwa lugha rahisi
Moduli katika Python ni faili la .py, pakiti ni folda ya moduli, na maktaba ni seti ya pakiti zinazoitwa kwa import. Maktaba za nje husakinishwa kwa pip (au uv) ndani ya mazingira pepe venv — folda iliyotengwa yenye mkalimani na pakiti za mradi mmoja, ili matoleo ya miradi tofauti yasigongane.
Moduli katika Python ni faili la kawaida lenye msimbo, na import ndiyo njia ya kuchukua kazi na madarasa kutoka humo. Moduli hukusanywa kuwa pakiti, pakiti kuwa maktaba, na ili maktaba za nje za miradi tofauti zisigongane, husakinishwa kwenye mazingira pepe venv. Hebu tuchunguze mnyororo mzima: nini kinatokea wakati wa import, pakiti inavyopangwa, pip na venv zinavyofanya kazi, na lazy imports zilizoongezwa katika Python 3.15.
Moduli, pakiti, maktaba: tofauti yake
| Dhana | Ni nini | Mfano |
|---|---|---|
| Moduli | Faili moja .py; jina la moduli ni jina la faili bila kiendelezi | categories.py → import categories |
| Pakiti | Folda yenye moduli na faili __init__.py | expenses/report.py → from expenses.report import build |
| Maktaba | Seti tayari ya moduli na pakiti kwa kazi fulani | requests, pandas, pathlib ya kawaida |
| Kifurushi cha usambazaji (kifurushi cha PyPI) | Kumbukumbu inayosakinishwa na pip | pip install requests |
Maneno "maktaba", "pakiti" na "moduli" mara nyingi huchanganywa katika mazungumzo — ni kawaida. Jambo la msingi ni kwamba kitaalamu import hupakia moduli au pakiti kila wakati, na pip husakinisha kifurushi kutoka PyPI, ambacho ndani yake kuna pakiti.
Jinsi import inavyofanya kazi katika Python
Kuna aina kadhaa za import, na zote hukutana katika msimbo halisi:
import math # moduli nzima, matumizi math.sqrt
from math import sqrt, pi # majina mahususi
import datetime as dt # jina bandia
from collections import Counter as C
print(math.sqrt(16), sqrt(9), pi)
print(dt.date.today())
Majina bandia ni ya kawaida kwa maktaba kubwa: import numpy as np, import pandas as pd. Muundo from module import * ni bora kuepukwa: unachafua nafasi ya majina na kuficha asili ya jina.
Import hufanya nini hasa
- Inatafuta moduli kwenye kache ya
sys.modules. Ikiwa tayari imepakiwa — inarudisha tu. - Ikiwa haipo — inatafuta faili kwenye orodha ya folda
sys.path: folda ya skripti inayoendeshwa, maktaba ya kawaida, site-packages ya mazingira. - Inatekeleza faili lililopatikana lote kutoka juu kwenda chini.
- Inaweka kitu cha moduli kwenye kache na kukiunganisha na jina.
Kutokana na hili kuna hitimisho mbili za vitendo. Import ya pili ya moduli hiyo hiyo karibu haina gharama — msimbo hautekelezwi tena. Na msimbo wote wa ngazi ya juu wa moduli, pamoja na print na hesabu nzito, unatekelezwa wakati wa import.
import sys
for p in sys.path:
print(p)
print("math" in sys.modules)
if __name__ == "__main__"
Kwa kuwa import hutekeleza faili, kunahitajika njia ya kutofautisha "niliendeshwa kama skripti" na "niliingizwa kama moduli". Kwa hilo kuna kigezo __name__: wakati faili linaendeshwa ni "__main__", wakati linapoingizwa ni jina la moduli.
# categories.py
def guess(title: str) -> str:
return "chakula" if "mkahawa" in title.lower() else "nyingine"
if __name__ == "__main__":
print(guess("Mkahawa wa nyumbani")) # itatekelezwa tu kwa python categories.py
Kwa pakiti kuna njia mbadala: faili __main__.py ndani yake, na uendeshaji kwa python -m expenses.
Moduli za kawaida za Python
Python inakuja "na betri": mamia ya moduli zilizojengwa ndani zinapatikana mara moja, bila kusakinisha. Zinazotumika zaidi:
| Moduli | Kwa ajili ya nini |
|---|---|
os, sys, pathlib, shutil | Mfumo, njia, faili |
json, csv, pickle | Miundo ya data |
datetime, time, calendar | Tarehe na muda |
math, random, statistics, fractions | Namba |
re, string | Kazi na maandishi |
collections, itertools, functools | Miundo ya data na iterators |
logging, argparse, subprocess | Logi, hoja za mstari wa amri, kuendesha programu |
asyncio, threading | Asynchronous na threads |
Orodha kamili ya moduli za maktaba ya kawaida imehifadhiwa kwenye sys.stdlib_module_names (Python 3.10+). Kuona kilichomo ndani ya moduli, tumia dir(math) na help(math).
Pakiti yako mwenyewe: muundo wa mradi
Moduli zinapokuwa nyingi, zinakusanywa kuwa pakiti. Mpangilio unaotumika sana ni src-layout:
expenses-project/
├── pyproject.toml
└── src/
└── expenses/
├── __init__.py
├── cli.py
├── parsing.py
├── categories.py
└── report.py
Ndani ya pakiti moduli huagizana kwa jina la pakiti (from expenses.categories import guess) au kwa njia ya jamaa (from .categories import guess). Import ya jamaa inafanya kazi ndani ya pakiti tu, si kwenye faili linaloendeshwa moja kwa moja kama skripti.
pip katika Python: kusakinisha maktaba
Maktaba za nje zipo kwenye PyPI, na pip ndiyo chombo cha kuzisakinisha, kinachokuja pamoja na Python. Salama zaidi ni kuiita kupitia mkalimani — hivyo maktaba inaingia kwenye Python utakayoendesha msimbo nao.
python -m pip install requests # kusakinisha
python -m pip install "pandas>=2.3" # kwa kikomo cha toleo
python -m pip install --upgrade requests
python -m pip uninstall requests # kuondoa
python -m pip list # orodha ya pakiti zilizosakinishwa
python -m pip show requests # toleo na utegemezi
python -m pip freeze > requirements.txt
python -m pip install -r requirements.txt
Kwenye Windows mara nyingi badala ya python hutumika kizindua py. Pip ikikosekana, moduli iliyojengwa ndani inaisakinisha: python -m ensurepip --upgrade.
Maktaba maarufu za Python
Pakiti kwenye PyPI ni mamia ya maelfu, lakini miradi mingi hutumia orodha fupi moja ileile. Anza nayo, badala ya kutafuta mambo ya ajabu.
| Kazi | Maktaba |
|---|---|
| Maombi ya HTTP na API | requests, httpx |
| Uchambuzi wa data na majedwali | pandas, numpy |
| Michoro | matplotlib |
| Huduma za wavuti | fastapi, django, flask |
| Majaribio | pytest |
| Picha | pillow (inaingizwa kama PIL) |
Angalia: jina la kusakinisha na jina la kuingiza halifanani kila wakati. Unasakinisha pip install pillow, lakini unaandika from PIL import Image; unasakinisha opencv-python, lakini unaingiza cv2. Ikiwa import inaanguka mara baada ya usakinishaji, angalia kwenye nyaraka za pakiti jina linalotumika kuingiza.
Kusakinisha maktaba kwenye Linux
Kwenye Debian na Ubuntu za kisasa, amri pip install kwenye Python ya mfumo inaishia kwa hitilafu externally-managed-environment (PEP 668). Hii ni kinga: Python ya mfumo ni ya meneja wa vifurushi wa OS, na pip haipaswi kuiharibu. Suluhisho sahihi si --break-system-packages, bali mazingira pepe.
venv katika Python: mazingira pepe
Mazingira pepe ni folda tofauti yenye nakala yake ya mkalimani (kiungo kwake) na site-packages yake. Maktaba zilizosakinishwa humo zinaonekana kwa mradi huo tu. Hivyo mradi mmoja unaweza kutumia Django 4 na jirani yake Django 5, bila migogoro.
Moduli venv imejengwa ndani ya Python, hairuhusu kusakinishwa tofauti (kwenye Debian/Ubuntu wakati mwingine inahitaji pakiti ya mfumo python3-venv).
# kuunda mazingira kwenye folda .venv
python -m venv .venv
# kuwezesha: Linux na macOS
source .venv/bin/activate
# kuwezesha: Windows PowerShell
.venv\Scripts\Activate.ps1
# sasa pip inasakinisha pakiti ndani ya .venv
python -m pip install requests
python -c "import sys; print(sys.prefix)"
# kutoka kwenye mazingira
deactivate
Baada ya kuwezesha, mwanzoni mwa mstari wa terminal unaonekana (.venv). Folda ya mazingira haiwekwi kwenye git (ongeza .venv/ kwenye .gitignore) wala haihamishwi kati ya mashine — badala yake orodha ya utegemezi inahifadhiwa, na mazingira yanaundwa upya. Ikiwa PowerShell inazuia kuendesha skripti ya kuwezesha, ruhusu kwa mtumiaji: Set-ExecutionPolicy -Scope CurrentUser RemoteSigned.
uv na pyproject.toml
Miradi ya kisasa inaeleza utegemezi katika pyproject.toml. Meneja uv, unaotumika kwenye kozi, anachanganya kuunda mazingira na kusakinisha: uv add pandas inapakua pakiti, inaiandika kwenye pyproject.toml na kurekodi matoleo kamili kwenye uv.lock. Mwenzako anaklona mradi, anaendesha uv sync — na anapata mazingira yanayofanana kabisa.
[project]
name = "expenses"
version = "0.1.0"
requires-python = ">=3.15"
dependencies = [
"pandas>=2.3",
]
[project.scripts]
expenses = "expenses.cli:main"
Lazy imports katika Python 3.15 (PEP 810)
Habari kubwa ya 3.15 katika mada hii ni neno kuu lazy. Maktaba nzito hupakia kwa muda mrefu: katika kipimo cha kozi kwenye picha ya python:3.15-slim, import ya kawaida ya pandas ilichukua takriban 415 ms, na lazy import pandas — takriban 13 ms. Kwa zana ya mstari wa amri inayoendeshwa kwa ajili ya --help, tofauti hiyo ni kubwa sana.
lazy import pandas as pd
lazy from expenses.report import build_report
def main() -> None:
...
df = pd.read_csv(path) # upakiaji halisi wa pandas — hapa
Badala ya moduli, jina linapata kitu cha kiwakilishi (proxy) (types.LazyImportType), na import halisi hufanyika wakati jina linapotumika kwa mara ya kwanza. Ikiwa hilo halijatokea, hakuna muda unaopotea kabisa.
Mipaka ya lazy import
- Inaruhusiwa tu kwenye ngazi ya juu ya moduli: ndani ya kazi, darasa au
try/except— niSyntaxError. lazy from x import *hairuhusiwi.ModuleNotFoundErroritatokea si wakati wa kuanza, bali wakati wa matumizi ya kwanza.- Athari za pembeni za moduli (kusajili programu-jalizi na kadhalika) zinahamia kwa wakati.
Kufanya import zote kuwa lazy kwa wakati mmoja kunawezekana kwa bendera -X lazy_imports=all au kwa kigezo cha mazingira PYTHON_LAZY_IMPORTS=all; vighairi vinawekwa kwa sys.set_lazy_imports_filter(). Kwa msimbo unaohitaji kufanya kazi pia kwenye matoleo ya zamani kuna kigezo cha moduli __lazy_modules__ = ["pandas"]: 3.15 itafanya import zilizotajwa kuwa lazy, na matoleo ya zamani yatafanya import ya kawaida tu. Muda unaotumika wakati wa kuanza unaonyeshwa na python -X importtime -c "import pandas". Faida kubwa ni kwa programu zinazoanzishwa mara nyingi kwa muda mfupi; seva inayoendelea kufanya kazi kwa muda mrefu haipati faida kubwa.
Makosa ya kawaida
ModuleNotFoundError: No module named 'requests'— maktaba imesakinishwa kwenye Python nyingine, au mazingira hayajawashwa. Thibitisha kwapython -m pip show requestskwa mkalimani uleule.- Faili lako limeitwa
json.py,random.pyaucsv.py— folda ya skripti iko kwanza kwenyesys.path, na linafunika moduli ya kawaida. Python 3.13+ inapendekeza "consider renaming" kwenye kosa. Badilisha jina la faili na ufute__pycache__. - Import ya mzunguko:
a.pyinaingizab.py, na hiyo inaingizaa.py. Weka vitu vya pamoja kwenye moduli ya tatu, au ingiza ndani ya kazi. - pip imeendeshwa ndani ya mkalimani wa Python (
>>> pip install) — utapataSyntaxError. Amri za pip zinaendeshwa kwenye terminal.
Hitimisho
Moduli ni faili, pakiti ni folda ya moduli, maktaba ni seti yao tayari; import hutafuta moduli kwenye kache na kwenye sys.path, na kuitekeleza mara moja tu. Maktaba za nje zisakinishe kwa pip au uv pekee ndani ya mazingira pepe ya venv — hivyo miradi haigongani, na mazingira yanaweza kurudiwa kwa urahisi. Katika kozi ya Python mada hii inafundishwa kwa vitendo: kifuatiliaji cha matumizi kinageuka kuwa pakiti yenye utegemezi na kuanza kwa kasi kwa lazy imports.
Maswali ya mara kwa mara
Je, ninahitaji kuunda venv kwa kila mradi?
Ndiyo, ni mazoezi mazuri: kila mradi una matoleo yake ya maktaba, na mazingira tofauti yanazuia migogoro na kuweka Python ya mfumo safi.
pip inatofautianaje na uv?
pip husakinisha pakiti tu, wakati uv pia huunda mazingira, huandika utegemezi kwenye pyproject.toml na kurekodi matoleo kamili kwenye faili la lock; pia ni haraka zaidi.
Ninawezaje kuona orodha ya maktaba zilizosakinishwa katika Python?
Endesha python -m pip list kwenye mazingira husika; pip freeze hutoa orodha hiyohiyo katika muundo wa requirements.txt.
Moduli zilizosakinishwa zimehifadhiwa wapi?
Kwenye folda ya site-packages ya mazingira husika; njia ya moduli fulani inaonyeshwa na sifa __file__, kwa mfano import requests; print(requests.__file__).
Je, naweza kuhamisha folda ya venv kwenda kompyuta nyingine?
Hapana, mazingira yanafungwa kwenye njia na mkalimani wa mashine husika; huhamishwa orodha ya utegemezi, na mazingira yanaundwa upya.
Mada hii inafundishwa kwa kina pamoja na mazoezi katika kozi “Python 3.15: от новичка до профи”.
Nenda kwenye kozi