TANTRAN.DEV 19/10/2026

Nên chia tay “pip freeze” cho các project python

pip freeze ghi lại mọi package đã cài dù có dùng hay không, làm requirements.txt phình to và container nặng thêm. pipreqs chỉ liệt kê những thư viện mà code thật sự import.

Càng ngày làm nhiều với docker container và chia sẻ code, tôi thấy nhu cầu quản lý các package càng quan trọng hơn để đảm bảo code chạy được trên nhiều môi trường. Chỉ cần một file requirements.txt là mọi chuyện sẽ có người lo, đảm bảo các thư viện và package có sẵn trước khi chạy code.

Ngoài ra trong quá trình code, nhất là lúc đang học một framework mới hay thử nghiệm các thư viện khác nhau, tôi sẽ install rất nhiều package qua một thời gian dài mà lại chẳng mấy khi uninstall, cuối cùng chẳng nhớ là mình đang xài cái gì, nên một công cụ tự động sinh requirements.txt sẽ giúp ích rất nhiều.

Một trong những cách trước giờ tôi thường dùng là lệnh “pip freeze” có sẵn trong python.

Giải pháp pip freeze

Chỉ cần gõ lệnh:

pip freeze // để xem danh sách
pip freeze > requirements.txt // để tạo file

là xong việc, đảm bảo bạn có các package cần thiết cũng như các package phụ thuộc để chạy được chương trình của mình.

Tuy nhiên một ngày nọ tôi lại thấy có gì đó sai sai, là sao danh sách package của mình dài vậy trong khi mình chỉ xài có một vài cái (tôi rất hạn chế cài đặt package vì sợ không kiểm soát được chương trình của mình). Và phát hiện một số vấn đề như sau:

  • Package A cần có B và C để chạy. Khi bạn không dùng A nữa thì B, C sẽ không cần nữa nhưng vẫn nằm đó, cần phải gỡ ra.
  • Hoặc khi A nâng cấp lên phiên bản mới hơn sẽ đi kèm với phiên bản B, C khác, và lúc này bạn phải xử lý bằng tay để đảm bảo các thư viện mình dùng là tốt nhất và không phá vỡ chương trình của bạn.

Tìm hiểu một chút, tôi nhận ra cơ chế của pip freeze khá đơn giản, không đáp ứng được yêu cầu:

  • “pip freeze” sẽ log các package cài bằng “pip install” trong venv, nên ở tình huống bạn dùng ngoài venv hoặc sử dụng các tool khác nữa như chocolatey, conda, setuptools… thì bạn sẽ phải xử lý bằng tay với các package này để đảm bảo nó được đề cập trong requirements.txt.
  • “pip freeze” sẽ log lại tất cả package cho dù có xài hay không xài, cho nên sẽ làm cho container của bạn nặng nề hơn không cần thiết.

Giải pháp cài thêm pipreqs

Đó là cài thêm một thư viện nữa là pipreqs để xử lý các vấn đề trên một cách rất user-friendly. Cài bằng pip luôn, sau đó dùng bằng cách gọi ngay ở thư mục project.

Chèn code vào đây.

So sánh pip freeze, conda, pipreqs

pip freeze

(.venv) % pip freeze
asgiref==3.5.2
autopep8==1.6.0
Django==4.0.6
django-widget-tweaks==1.4.12
pycodestyle==2.8.0
sqlparse==0.4.2
toml==0.10.2

conda

(.venv) % conda list -e
# This file may be used to create an environment using:
# $ conda create --name <env> --file <this file>
# platform: osx-arm64
brotlipy=0.7.0=py39h5161555_1003
ca-certificates=2021.10.8=h4653dfc_0
certifi=2021.10.8=py39h2804cbe_1
cffi=1.15.0=py39h52b1de0_0
charset-normalizer=2.0.9=pyhd8ed1ab_0
colorama=0.4.4=pyh9f0ad1d_0
conda=4.11.0=py39h2804cbe_0
conda-package-handling=1.7.3=py39h5161555_1
cryptography=36.0.0=py39hfb8cd70_0
idna=3.1=pyhd3deb0d_0
libffi=3.4.2=h3422bc3_5
libzlib=1.2.11=hee7b306_1013
ncurses=6.2=h9aa5885_4
openssl=1.1.1l=h3422bc3_0
pip=21.3.1=pyhd8ed1ab_0
pycosat=0.6.3=py39h5161555_1009
pycparser=2.21=pyhd8ed1ab_0
pyopenssl=21.0.0=pyhd8ed1ab_0
pysocks=1.7.1=py39h2804cbe_4
python=3.9.7=h54d631c_3_cpython
python_abi=3.9=2_cp39
readline=8.1=hedafd6a_0
requests=2.26.0=pyhd8ed1ab_1
ruamel_yaml=0.15.80=py39h5161555_1006
setuptools=59.4.0=py39h2804cbe_0
six=1.16.0=pyh6c4a22f_0
sqlite=3.37.0=h72a2b83_0
tk=8.6.11=he1e0b03_1
tqdm=4.62.3=pyhd8ed1ab_0
tzdata=2021e=he74cb21_0
urllib3=1.26.7=pyhd8ed1ab_0
wheel=0.37.0=pyhd8ed1ab_1
xz=5.2.5=h642e427_1
yaml=0.2.5=h642e427_0
zlib=1.2.11=hee7b306_1013

pipreqs

(.venv) % pipreqs --print
attr==0.3.2
bpython==0.22.1
brotli==1.0.9
brotlicffi==1.0.9.2
ConfigParser==5.2.0
cryptography==37.0.4
cx_Oracle==8.3.0
Cython==0.29.32
dl==0.1.0
docutils==0.19
HTMLParser==0.0.2
ipdb==0.13.9
ipython==8.4.0
ipywidgets==7.7.1
jnius==1.1.0
keyring==23.7.0
lockfile==0.12.2
mock==4.0.3
MySQL-python==1.2.5
numpy==1.23.1
Pillow==9.2.0
protobuf==4.21.4
psycopg2==2.9.3
pylibmc==1.6.1
pymemcache==3.5.2
pyOpenSSL==22.0.0
python_memcached==1.59
pytz==2022.1
pywatchman==1.4.1
PyYAML==6.0
railroad==0.5.0
simplejson==3.17.6
Sphinx==5.1.1
tblib==1.7.0
testsuite==0.1.2
tornado==6.2
trove_classifiers==2022.7.22
truststore==0.4.0
unicodedata2==14.0.0
xmlrpclib==1.0.1
INFO: Successfully output requirements