Hướng dẫn pyinstaller python
Mục lục bài viết:
Show
Bạn có ghen tị với việc các nhà phát triển Go xây dựng một tệp thực thi và dễ dàng chuyển nó cho người dùng không? Sẽ thật tuyệt nếu người dùng của bạn có thể chạy ứng dụng của bạn mà không cần cài đặt bất cứ thứ gì? Đó là giấc mơ và PyInstaller là một cách để đạt được điều đó trong hệ sinh thái Python. Có vô số hướng dẫn về cách thiết lập môi trường ảo, quản lý các phần phụ thuộc và xuất bản lên PyPI, điều này rất hữu ích khi bạn đang tạo các thư viện Python. Có ít thông tin hơn cho các nhà phát triển xây dựng các ứng dụng Python. Hướng dẫn này dành cho các nhà phát triển muốn phân phối ứng dụng cho người dùng có thể là nhà phát triển Python. Trong hướng dẫn này, bạn sẽ học những điều sau:
PyInstaller cung cấp cho bạn khả năng tạo một thư mục hoặc tệp thực thi mà người dùng có thể chạy ngay lập tức mà không cần cài đặt thêm. Để đánh giá đầy đủ sức mạnh của PyInstaller, bạn nên xem lại một số vấn đề về phân phối mà PyInstaller giúp bạn tránh. Vấn đề phân phốiThiết lập một dự án Python có thể gây khó chịu, đặc biệt là đối với những người không phải là nhà phát triển. Thông thường, quá trình thiết lập bắt đầu bằng việc mở một Terminal, một thiết bị đầu cuối không dành cho một nhóm lớn người dùng tiềm năng. Kỹ thuật "rào đón - roadblock" này khiến người dùng dừng lại ngay cả trước khi hướng dẫn cài đặt đi sâu vào các chi tiết phức tạp của môi trường ảo, phiên bản Python và vô số phụ thuộc tiềm năng. Hãy nghĩ về những gì bạn thường trải qua khi cài đặt trên một máy tính mới để phát triển Python. Nó có thể diễn ra như thế này:
Hãy dừng lại một chút và xem xét xem bất kỳ bước nào ở trên có ý nghĩa gì không nếu bạn không phải là nhà phát triển, chứ đừng nói là nhà phát triển Python. Chắc là không. Những vấn đề này phát sinh nếu người dùng của bạn đủ may mắn để truy cập vào phần phụ thuộc của cài đặt. Nhưng một số phụ thuộc vẫn yêu cầu trình biên dịch C/C++ hoặc thậm chí là FORTRAN! Rào cản gia nhập này quá cao nếu mục tiêu của bạn là cung cấp ứng dụng cho càng nhiều người dùng càng tốt. PyInstallerPyInstaller tóm tắt những chi tiết này từ người dùng bằng cách tìm tất cả các phần phụ thuộc của bạn và nhóm chúng lại với nhau. Người dùng của bạn thậm chí sẽ không biết họ đang chạy một dự án Python vì bản thân Trình thông dịch Python được đóng gói vào ứng dụng của bạn. Như vậy thì PyInstaller sẽ giúp ta say goodbye các hướng dẫn cài đặt phức tạp! PyInstaller thực hiện kỳ tích tuyệt vời này bằng cách xem xét nội dung mã Python của bạn, phát hiện các phần phụ thuộc của bạn và sau đó đóng gói chúng thành một định dạng phù hợp tùy thuộc vào Hệ điều hành của bạn. Có rất nhiều chi tiết thú vị về PyInstaller, nhưng bây giờ bạn sẽ tìm hiểu những điều cơ bản về cách hoạt động và cách sử dụng nó. Bạn luôn có thể tham khảo tài liệu PyInstaller tuyệt vời nếu bạn muốn biết thêm chi tiết. Ngoài ra, PyInstaller có thể tạo tệp thực thi cho Windows, Linux hoặc macOS. Điều này có nghĩa là người dùng Windows sẽ nhận được một bản Chuẩn bị dự án của bạnPyInstaller yêu cầu ứng dụng của bạn tuân theo một số cấu trúc tối thiểu, cụ thể là bạn phải có tập lệnh CLI để khởi động ứng dụng của mình. Thông thường, điều này có nghĩa là tạo một tập lệnh nhỏ bên
ngoài gói Python của bạn tức là import gói của bạn và chạy Tập lệnh đầu vào là một tập lệnh Python. Về mặt kỹ thuật, bạn có thể làm bất cứ điều gì bạn muốn trong tập lệnh đầu vào, nhưng bạn nên tránh sử dụng các import tương đối. Bạn vẫn có thể sử các import tương đối trong suốt phần còn lại của ứng dụng nếu đó là kiểu bạn thích.
Bạn có thể thử điều này với dự án của riêng mình hoặc làm theo dự án trình đọc nguồn cấp dữ liệu Python thực. Để biết thêm thông tin chi tiết bạn hãy xem hướng dẫn về Xuất bản gói trên PyPI. Bước đầu tiên để xây dựng một phiên bản thực thi của dự án này là thêm tập lệnh điểm
vào. May mắn thay, dự án trình đọc nguồn cấp dữ liệu có cấu trúc tốt, vì vậy tất cả những gì bạn cần là một tập lệnh ngắn bên ngoài gói để chạy nó. Ví dụ: bạn có thể tạo một tệp gọi là
Tập lệnh Việc tạo tập lệnh đầu vào này rất đơn giản khi bạn đang làm việc trong dự án của riêng mình vì bạn
đã quen thuộc với mã. Tuy nhiên, việc tìm điểm đầu vào mã của người khác không dễ dàng như vậy. Trong trường hợp này, bạn có thể bắt đầu bằng cách xem tệp Tìm tham chiếu đến đối số
Như bạn có thể thấy, tập lệnh Sau thay đổi này, thư mục dự án của reader sẽ trông như thế này, giả sử bạn đã kiểm tra nó vào một thư mục có tên
Lưu ý rằng không có thay đổi nào đối với chính mã trình đọc, chỉ là một tệp mới gọi là Tuy nhiên, bạn cũng sẽ muốn tìm cách sử dụng Bạn có thể chỉ định thủ công các import ẩn để buộc PyInstaller tích hợp các phụ thuộc đó nếu việc thay đổi các import trong ứng dụng của bạn quá khó. Bạn sẽ thấy cách thực hiện việc này sau trong hướng dẫn này. Khi bạn có thể khởi chạy ứng dụng của mình bằng tập lệnh Python bên ngoài gói của mình, thì bạn đã sẵn sàng để PyInstaller thử tạo tệp thực thi. Sử dụng PyInstallerBước đầu tiên là cài đặt PyInstaller từ PyPI. Bạn có thể làm điều này bằng cách sử dụng pip giống như các gói Python khác:
Bạn sẽ sử dụng giao diện thư viện nếu bạn tạo các tệp hook của riêng mình. Bạn sẽ tăng khả năng mặc định của PyInstaller tạo tệp thực thi nếu bạn chỉ có các phụ thuộc Python thuần túy. Tuy nhiên, đừng quá căng thẳng nếu bạn có nhiều phụ thuộc phức tạp hơn với phần mở rộng C / C ++. PyInstaller hỗ trợ rất nhiều gói phổ biến như NumPy, PyQt và Matplotlib mà bạn không cần thực hiện thêm bất kỳ công việc nào. Bạn có thể xem thêm về danh sách các gói mà PyInstaller chính thức hỗ trợ bằng cách tham khảo tài liệu PyInstaller. Đừng lo lắng nếu một số phụ thuộc của bạn không được liệt kê trong tài liệu chính thức. Nhiều gói Python hoạt động tốt. Trên thực tế, PyInstaller đủ phổ biến để nhiều dự án có giải thích về cách làm cho mọi thứ hoạt động với PyInstaller. Nói tóm lại, cơ hội để dự án của bạn hoạt động hiệu quả là rất cao. Để thử tạo một tệp thực thi với tất cả các giá trị mặc định, chỉ cần cung cấp cho PyInstaller tên của tập lệnh đầu vào chính của bạn. Đầu
tiên, Ví dụ: thực hiện lệnh sau sau khi bạn
Đừng lo lắng nếu bạn thấy nhiều đầu ra trong khi xây dựng tệp thực thi của mình. PyInstaller là dài theo mặc định và độ dài có thể được tạo ra để gỡ lỗi mà bạn sẽ thấy sau. Sâu hơn PyInstallerPyInstaller rất phức tạp và sẽ tạo ra rất nhiều đầu ra. Vì vậy, điều quan trọng trước tiên là phải biết những gì cần tập trung vào. Cụ thể, tệp thực thi mà bạn có thể phân phối cho người dùng của mình và thông tin gỡ lỗi tiềm năng. Theo mặc định,
lệnh
File SpecFile spec sẽ được đặt tên theo tập lệnh CLI của bạn theo mặc định. Theo dõi ví dụ trên bạn sẽ thấy một tệp có tên
Tệp này sẽ được tạo tự động bằng lệnh Đừng lo lắng, bạn không cần phải hiểu đoạn mã trên để sử dụng PyInstaller một cách hiệu quả! Tệp này có thể được sửa đổi và sử dụng lại để tạo tệp thực thi sau này. Bạn có thể thực hiện các bản dựng trong tương lai nhanh hơn một chút bằng cách cung cấp tệp đặc tả này thay vì tập lệnh đầu vào cho lệnh Có một số trường hợp sử dụng cụ thể cho các tệp thông số kỹ thuật của PyInstaller. Tuy nhiên, đối với các dự án đơn giản, bạn sẽ không cần phải lo lắng về những chi tiết đó trừ khi bạn muốn tùy chỉnh nhiều cách dự án của mình được xây dựng. Thư mục buildThư mục
Thư mục build có thể hữu ích để gỡ lỗi, nhưng trừ khi bạn gặp sự cố, thư mục này phần lớn có thể bị bỏ qua. Bạn sẽ tìm hiểu thêm về cách gỡ lỗi sau trong hướng dẫn này. Thư mục distSau khi xây dựng, bạn
sẽ kết thúc với một thư mục
Thư Bạn cũng sẽ tìm thấy rất nhiều các tập tin với phần mở rộng Bạn sẽ muốn phân phối toàn bộ thư mục Tại thời điểm này, bạn có thể thử chạy file thực thi Bạn sẽ nhận thấy rằng việc chạy tệp thực thi dẫn đến lỗi đề cập đến file Một số lệnh tùy chỉnhPyInstaller đi kèm với rất nhiều tùy chọn có thể được cung cấp dưới dạng tệp thông số kỹ thuật hoặc tùy chọn CLI thông thường. Dưới đây, bạn sẽ tìm thấy một số tùy chọn phổ biến và hữu ích nhất.
Đây là một cách để tránh tệp thực thi, tệp đặc tả và các thư mục được đặt tên theo tập lệnh đầu vào của bạn. Bạn có thể tạo một tệp thực thi gọi là
Các tùy chọn mặc định tạo ra một thư mục phụ thuộc and và thực thi, trong khi Tùy chọn này không có đối số. Để nhóm dự án của bạn thành một tệp duy nhất, bạn có thể xây dựng bằng một lệnh như sau:
Với lệnh trên, thư mục
Đây là một cách để làm việc xung quanh mã của bạn bằng cách sử dụng Tùy chọn này yêu cầu tên của gói mà bạn muốn đưa vào tệp thực thi của mình. Ví dụ: nếu dự án của bạn đã import thư viện requests bên trong một hàm, thì PyInstaller sẽ không tự động đưa
Bạn có thể chỉ định điều này nhiều lần trong lệnh build của mình, một lần cho mỗi lần import ẩn.
Điều này hữu ích khi bạn muốn nhóm trong các tệp cấu hình, ví dụ hoặc dữ liệu không phải mã khác. Bạn sẽ thấy một ví dụ về điều này sau nếu bạn đang theo dõi cùng với dự án trình đọc nguồn cấp dữ liệu.
Điều này rất hữu ích để loại trừ các yêu cầu chỉ dành cho nhà phát triển như framework testing chẳng hạn. Đây là một cách tuyệt vời để giữ kết quả mà trong đó bạn cung cấp cho người dùng càng nhỏ càng tốt. Ví dụ: nếu bạn sử dụng pytest, bạn có thể muốn loại trừ điều này khỏi tệp thực thi của mình:
Điều này chỉ hữu ích nếu bạn đang xây dựng một ứng dụng hỗ trợ GUI. Điều này giúp bạn ẩn các chi tiết về việc triển khai của mình bằng cách cho phép người dùng không bao giờ nhìn thấy thiết bị đầu cuối. Tương tự như tùy chọn
File Như đã đề cập trước đó, bạn có thể sử dụng lại file Vì nó là một tập lệnh Python thông thường, nên bạn có thể làm hầu hết mọi thứ bên trong nó. Bạn có thể tham khảo tài liệu tệp PyInstaller Spec chính thức để biết thêm thông tin về API này. Kiểm tra khả năng thực thi mới của bạnCách tốt nhất để kiểm tra tệp thực thi mới của bạn là trên một máy mới. Máy mới phải có cùng hệ điều hành với máy bản dựng của bạn. Lý tưởng nhất là máy này càng giống với những gì người dùng của bạn sử dụng càng tốt. Điều đó có thể không phải lúc nào cũng có thể thực hiện được, vì vậy điều tốt nhất tiếp theo là thử nghiệm trên máy của chính bạn. Điều quan trọng là chạy tệp thực thi kết quả mà không cần kích hoạt môi trường phát triển của bạn. Điều này có nghĩa chạy mà không có Tiếp theo với ví dụ về trình đọc nguồn cấp dữ liệu, bạn sẽ nhận thấy rằng việc chạy file thực thi
Gói
Lệnh này yêu cầu PyInstaller đưa file
Bạn sẽ muốn điều chỉnh đường dẫn trong lệnh trên để phù hợp với nơi bạn đã cài đặt phần phụ thuộc của trình đọc nguồn cấp dữ liệu. Bây giờ chạy tệp thực thi mới sẽ dẫn đến lỗi mới về file Tệp này được yêu cầu bởi dự án trình đọc nguồn cấp dữ liệu, vì vậy bạn cần đảm bảo đưa nó vào bản dựng của mình:
Một lần nữa, bạn sẽ cần điều chỉnh đường dẫn đến tệp dựa trên nơi bạn có dự án trình đọc nguồn cấp dữ liệu. Tại thời điểm này, bạn sẽ có một tệp thực thi đang hoạt động có thể được cung cấp trực tiếp cho người dùng! Gỡ lỗi thực thi PyInstallerNhư bạn đã thấy ở trên, bạn có thể gặp sự cố khi chạy tệp thực thi của mình. Tùy thuộc vào mức độ phức tạp của dự án của bạn, các bản sửa lỗi có thể đơn giản như bao gồm các tệp dữ liệu như ví dụ về trình đọc nguồn cấp dữ liệu. Tuy nhiên, đôi khi bạn cần nhiều kỹ thuật gỡ lỗi hơn. Dưới đây là một số chiến lược phổ biến không theo thứ tự cụ thể. Thông thường, một trong những chiến lược này hoặc sự kết hợp sẽ dẫn đến đột phá trong các phiên gỡ lỗi khó khăn. Sử dụng thiết bị đầu cuốiĐầu tiên, hãy thử chạy tệp thực thi từ một thiết bị đầu cuối để bạn có thể xem tất cả kết quả đầu ra. Hãy nhớ xóa cờ build Gỡ lỗi fileKiểm tra file Bản dựng thư mục đơnSử dụng chế độ phân phối
Tùy chọn CLI bổ sungPyInstaller cũng có các tùy chọn để kiểm soát lượng thông tin được in ra trong quá trình xây dựng. Xây dựng lại tệp thực thi với tùy chọn PyInstaller sẽ tạo ra nhiều đầu ra khi tăng độ dài với
Bằng cách sử dụng lệnh trên, bạn sẽ có một tệp được gọi là
Dưới đây là ví dụ về file
Tệp này sẽ có nhiều thông tin chi tiết về những gì được đưa vào trong bản dựng của bạn, tại sao một số thứ không được đưa vào và cách tệp thực thi được đóng gói. Bạn cũng có thể xây dựng lại tệp thực thi của mình bằng cách sử dụng tùy chọn
Tài liệu PyInstaller bổ sungPyInstaller GitHub Wiki có rất nhiều liên kết hữu ích và các mẹo gỡ rối. Đáng chú ý nhất là các phần về đảm bảo mọi thứ được đóng gói chính xác và phải làm gì nếu mọi thứ xảy ra sai sót. Hỗ trợ phát hiện phụ thuộcVấn đề phổ biến nhất bạn sẽ thấy là ngoại lệ Nhiều loại sự cố này có thể được giải quyết bằng cách sử dụng tùy chọn Một cách khác để giải quyết các vấn đề là móc tệp. Các tệp này chứa thông tin bổ sung để giúp PyInstaller đóng gói phần phụ thuộc. Bạn có thể viết các hook của riêng mình và yêu cầu PyInstaller sử dụng chúng với tùy chọn CLI Các tệp hook là cách PyInstaller tự hoạt động bên trong nên bạn có thể tìm thấy nhiều tệp hook mẫu trong mã nguồn PyInstaller. Hạn chếPyInstaller cực kỳ mạnh mẽ, nhưng nó có một số hạn chế. Một số hạn chế đã được thảo luận đến: import ẩn và import tương đối trong tập lệnh đầu vào. PyInstaller hỗ trợ tạo tệp thực thi cho Windows, Linux và macOS, nhưng không thể biên dịch chéo. Do đó, bạn không thể thực hiện nhắm mục tiêu một Hệ điều hành từ Hệ điều hành khác. Vì vậy, để phân phối các tệp thực thi cho nhiều loại HĐH, bạn sẽ cần một máy xây dựng cho mỗi HĐH được hỗ trợ. Liên quan đến giới hạn biên dịch
chéo, thật hữu ích khi biết rằng về mặt kỹ thuật PyInstaller không đóng gói hoàn toàn mọi thứ mà ứng dụng của bạn cần để chạy. Tệp thực thi của bạn vẫn phụ thuộc vào người dùng glibc. Thông thường, bạn có thể khắc phục hạn chế Ví dụ: nếu bạn muốn nhắm mục tiêu một loạt các máy Linux, thì bạn có thể xây dựng trên phiên bản CentOS cũ hơn. Điều này sẽ cung cấp cho bạn khả năng tương thích với hầu hết các phiên bản mới hơn phiên bản bạn xây dựng. Đây là chiến lược tương tự được mô tả trong PEP 0513 và là những gì PyPA khuyến nghị để xây dựng các wheel tương thích. Trên thực tế, bạn có thể muốn tìm hiểu bằng cách sử dụng hình ảnh docker manylinux của PyPA cho môi trường xây dựng Linux của bạn. Bạn có thể bắt đầu với hình ảnh cơ sở sau đó cài đặt PyInstaller cùng với tất cả các phần phụ thuộc của mình và có một hình ảnh xây dựng hỗ trợ hầu hết các biến thể của Linux. Phần kết luậnPyInstaller có thể giúp làm cho các tài liệu cài đặt phức tạp trở nên không cần thiết. Thay vào đó, người dùng của bạn có thể chỉ cần chạy tệp thực thi của bạn để bắt đầu nhanh nhất có thể. Quy trình làm việc của PyInstaller có thể được tóm tắt bằng cách thực hiện như sau:
Người dùng của bạn không cần phải biết bạn đã sử dụng phiên bản Python nào hoặc ứng dụng của bạn có sử dụng Python! |