Cách đóng gói chương trình Python thành tệp nhị phân trên Raspberry Pi 4B?

Tôi không thể cài đặt PyInstaller. Có cách nào khác để đóng gói các tệp Python thành tệp thực thi nhị phân trên Raspberry Pi không?

Bạn có thể cài đặt pyinstaller bằng pip

pip install pyinstaller

Tham khảo: https://www.cnblogs.com/wendaobiancheng/p/9772509.html

Sử dụng lệnh này sẽ dẫn đến lỗi sau và việc cài đặt sẽ không thành công.

pip install pyinstaller
error: externally-managed-environment

× Môi trường này được quản lý từ bên ngoài
╰─> Để cài đặt các gói Python trên toàn hệ thống, hãy thử dùng lệnh apt install
python3-xyz, với xyz là tên gói bạn đang cố gắng cài đặt.

Nếu bạn muốn cài đặt một gói Python không phải dạng gói Debian,
hãy tạo môi trường ảo bằng lệnh python3 -m venv path/to/venv.
Sau đó sử dụng path/to/venv/bin/python và path/to/venv/bin/pip. Hãy đảm bảo rằng bạn đã cài đặt python3-full.

Để biết thêm thông tin, truy cập http://rptl.io/venv

ghi chú: Nếu bạn cho rằng đây là một sai sót, vui lòng liên hệ nhà cung cấp cài đặt Python hoặc phân phối hệ điều hành của bạn. Bạn có thể bỏ qua cảnh báo này, nhưng với nguy cơ làm hỏng cài đặt Python hoặc hệ điều hành, bằng cách thêm tùy chọn --break-system-packages.
gợi ý: Xem PEP 668 để biết thông tin chi tiết về đặc tả kỹ thuật.

Sử dụng lệnh này: sudo apt install python3-pyinstaller

Không thể tìm thấy gói cài đặt tương ứng.
Đang đọc danh sách gói… Hoàn tất
Đang xây dựng cây phụ thuộc… Hoàn tất
Đang đọc thông tin trạng thái… Hoàn tất
E: Không thể xác định vị trí gói python3-pyinstaller

https://www.cnblogs.com/clark1990/p/17942952

Nên sử dụng pipx để cài đặt

Trên Raspberry Pi (Raspberry Pi 4B), nếu bạn không thể sử dụng PyInstaller, giải pháp thay thế mạnh mẽ nhất là Nuitka. Khác với PyInstaller chỉ đơn thuần “đóng gói”, Nuitka sẽ chuyển đổi mã Python của bạn thành mã C và biên dịch thành tệp nhị phân máy thật sự.

Dưới đây là một số phương pháp phổ biến để đóng gói Python thành tệp nhị phân trên Raspberry Pi:


1. Nuitka (Khuyên dùng nhất: Hiệu suất cao, biên dịch thật)

Nuitka hiện là công cụ đóng gói rất được ưa chuộng trong cộng đồng Python, đặc biệt phù hợp khi chạy trên môi trường Linux như Raspberry Pi. Các tệp nhị phân do Nuitka tạo ra thường có tốc độ thực thi nhanh hơn cả Python gốc.

Các bước cài đặt:

  1. Trước tiên, cài đặt trình biên dịch C cần thiết (hệ thống Raspberry Pi thường đã có sẵn, nhưng nên cập nhật):
sudo apt update
sudo apt install build-essential python3-dev
  1. Cài đặt Nuitka:
pip install nuitka

Lệnh đóng gói:

Chạy lệnh sau trong thư mục chứa chương trình của bạn:

python3 -m nuitka --standalone --onefile --remove-output your_script.py
  • --standalone: Bao gồm tất cả các thư viện phụ thuộc.
  • --onefile: Đóng gói mọi thứ thành một tệp thực thi duy nhất.
  • --remove-output: Xóa thư mục mã C tạm thời sau khi biên dịch xong.

2. cx_Freeze (Giải pháp thay thế ổn định và trưởng thành)

Nếu bạn cảm thấy Nuitka mất quá nhiều thời gian biên dịch (vì nó thực hiện tối ưu hóa phức tạp), thì cx_Freeze là lựa chọn gần giống với PyInstaller hơn.

Cài đặt:

pip install cx_Freeze

Cách sử dụng:

Tạo một tệp tên là setup.py:

from cx_Freeze import setup, Executable

setup(
    name = "我的程序",
    version = "1.0",
    description = "描述",
    executables = [Executable("your_script.py")]
)

Sau đó chạy trong terminal:

python3 setup.py build

Lệnh này sẽ tạo ra một thư mục build chứa tệp thực thi và các thư viện phụ thuộc.


3. Shiv (Giải pháp Zipapp: Nhẹ nhàng)

Nếu mục tiêu của bạn chỉ là “phân phối một tệp”, chứ không yêu cầu nghiêm ngặt về “mã hóa/mã nhị phân máy”, thì Shiv là lựa chọn rất tốt. Công cụ này tận dụng chức năng zipapp vốn có của Python.

Cách sử dụng:

pip install shiv
shiv -e your_module.main -o my_app .

Lệnh này sẽ nén toàn bộ mã nguồn và thư viện phụ thuộc thành một tệp .pyz lớn (trên Linux có thể cấp quyền thực thi và chạy trực tiếp bằng ./my_app). Ưu điểm là tốc độ đóng gói cực nhanh và rất ổn định.


4. Tại sao không thể cài đặt PyInstaller? (Các cách sửa lỗi phổ biến)

Nguyên nhân thường gặp khi cài đặt PyInstaller thất bại trên Raspberry Pi là thiếu binutils hoặc thư viện phát triển Python. Nếu muốn thử lại, hãy chạy trước:

sudo apt install python3-dev binutils libffi-dev
pip install pyinstaller

Nếu thông báo lỗi liên quan đến arm-linux-gnueabihf-gcc, thì thường là do thiếu gói build-essential.


So sánh các phương án

Công cụ Nguyên lý Ưu điểm Nhược điểm
Nuitka Biên dịch thành mã C Chạy nhanh, khó đảo ngược mã, tệp nhị phân thật Thời gian biên dịch lâu, đôi khi cần điều chỉnh để tương thích với thư viện phức tạp
cx_Freeze Đóng băng môi trường (Freeze) Cấu hình linh hoạt, hỗ trợ đa nền tảng tốt Tạo ra thư mục (trừ khi kết hợp với AppImage)
Shiv Gói nén (Zipapp) Tương thích 100% với mọi thư viện, đóng gói cực nhanh Máy đích phải cài sẵn trình thông dịch Python

Khuyến nghị:
Nếu bạn chú trọng bảo mật và hiệu suất, hãy dùng Nuitka; nếu bạn muốn đóng gói nhanh và không ngại việc máy đích có cài Python hay không, hãy dùng Shiv.