Bài viết nhằm giải quyết vấn nạn khi bạn chạy 1 python project ngon lành trên máy mình mà đem sang máy khác thì chết tức tưởi do thiếu các gói (requirement packages)


Giải pháp 1: giải pháp hiện đại. Sử dụng gói pipenv

pipenv là trình quản lý các gói của python thông qua Pipfile, tương tự như npm, yarn, bundler, cocoapods, carthage, composer

Để cài đặt pipenv có 2 cách

  • Cách 1 (khuyến khích): cài trực tiếp lên hệ thống, cần yêu cầu quyền root. Sử dụng lệnh sudo pip install pipenv
  • Cách 2: Cài đặt trong môi trường user hiện tại. Không yêu cầu quyền root nhưng yêu cầu thư mục $HOME/.local/bin phải nằm trong danh sách thư mục của biến môi trường $PATH. Sử dụng lệnh: pip install --user pipenv
  • Để sử dụng cách 2, cần phải thêm đường dẫn $HOME/.local/bin vào biến môi trường $PATH, bằng cách thêm dòng sau vào file $HOME/.profile (lưu ý không phải là file $HOME/.bashrc, còn trường hợp bạn sử dụng zsh thì dùng file $HOME/.zprofile)
export $PATH="$HOME/.local/bin:$PATH"

Sử dụng pipenv khá đơn giản

  • Dùng lệnh pipenv install để khởi tạo môi trường cho dự án mới. Phiên bản python được sử dụng cho dự án này chính là phiên bản được sử dụng để cài đặt gói pipenv. Vậy nên yêu cầu khi chạy dự án trên máy khác, thì trên máy chủ đó cũng cần yêu cầu phải cài đặt phiên bản python khớp với phiên bản ban đầu này
  • Để cài đặt thêm gói mới dùng lệnh pipenv install <package name>
  • Khởi động môi trường shell mới mà sử dụng các gói được thiết lập riêng trong dự án này. Dùng lệnh pipenv shell
  • Hoặc chạy các lệnh trong môi trường riêng cho dự án này mà không cần khởi tạo shell  bằng pipenv run <command>

Khi sao chép và chạy dự án trên máy mới, với pipenv bạn ko cần phải sao chép toàn bộ các gói yêu cầu, mà chỉ cần sao chép dự án với file PipfilePipfile.lock rồi sử dụng lệnh pipenv install trên máy mới, các gói yêu cầu sẽ được tự động cài đặt


Giải pháp 2: thủ công và cũ hơn giải pháp 1. Sử dụng gói virtualenv

Cài đặt gói virtualenv, cách làm tương tự như cài đặt gói pipenv ở "Giải pháp 1"

  • Để khởi tạo môi trường mới: virtualenv <dir name>. Lưu ý thư mục được chọn không nhất thiết và không nên được lưu vào dự án. Mà chỉ nên nằm trong thư mục bên ngoài dự án, chẳng hạn $HOME/python-envs/myproject-a
  • Kích hoạt môi trường: source <dir name>/bin/activate
  • Sau khi kích hoạt môi trường, các gói pip sẽ được quản lý độc lập, không bị phụ thuộc vào các gói trên máy chủ. Tiến hành cài đặt các gói thông qua pip install <package>
  • Lưu trữ các gói hiện tại và phiên bản vào file requirements.txt: pip freeze > requirements.txt
  • Ở trên máy chủ mới, cài đặt các gói yêu cầu đã được lưu trong requirements.txt thông qua: pip install -r requirements.txt

virtualenv là một giải pháp quản lý các gói của python cũ hơn so với pipenv, được sử dụng rộng rãi hơn, có cấu trúc file requirements.txt đơn giản, tiện lợi cho người sử dụng lại do chỉ cần dùng trực tiếp với pip. Tuy nhiên, khi phát triển thì cần phải quản trị thông qua thư mục lưu trữ file môi trường riêng biệt hoặc phải quản lý thủ công file requirements.txt


Làm thế nào để quản lý các phiên bản python khác nhau?

Sử dụng gói pyenv

Ngoài ra, có thể tham khảo thêm What is the difference between venv, pyvenv, pyenv, virtualenv, virtualenvwrapper, pipenv, etc?