Tạo một tệp thực thi duy nhất từ ​​một dự án Python


87

Tôi muốn tạo một tệp thực thi duy nhất từ ​​dự án Python của mình. Người dùng có thể tải xuống và chạy nó mà không cần cài đặt Python. Nếu tôi chỉ phân phối một gói, tôi có thể sử dụng pip, wheel và PyPI để xây dựng và phân phối nó, nhưng điều này yêu cầu người dùng phải có Python và biết cách cài đặt các gói. Tôi có thể sử dụng gì để xây dựng tệp thực thi độc lập từ một dự án Python?


Tôi vẫn đang viết bằng 2.x (chính xác là 2.7.2), nhưng có thể thấy cần phải chuyển sang 3.x (nếu các mô-đun và tương tự như vậy tương thích) và cũng sẽ cần một giải pháp.
ShadowFlame

Lưu ý rằng việc đóng gói sẽ làm phức tạp rất nhiều việc chẩn đoán vấn đề. Không chỉ bạn (hoặc pdb) không có quyền truy cập dễ dàng vào các tệp đang được thực thi, py2exe(dunno về những người khác) không bao gồm .pycác tệp nên bạn sẽ không thấy các dòng nguồn trong dấu vết ngăn xếp.
ivan_pozdeev

Cũng giống như một địa điểm ưa thích, tôi đã bắt đầu sử dụng PyInstaller
ShadowFlame

Câu trả lời:


115

Đây là một số cái phổ biến. Trừ khi được ghi chú rõ ràng, tất cả các dự án được liệt kê dưới đây đang được duy trì tích cực kể từ lần chỉnh sửa cuối cùng của tôi (tháng 1 năm 2020).

Tôi cũng đã bao gồm các liên kết đến các trang web, đại diện và danh sách PyPi tương ứng của họ trong trường hợp bạn muốn tự mình kiểm tra tần suất chúng được cập nhật.

Ngoài ra, trừ khi có ghi chú khác, tất cả các chương trình được liệt kê bên dưới sẽ tạo ra exe dành riêng cho hệ điều hành mà nó đang chạy. Vì vậy, ví dụ: chạy Pyinstaller trong Windows sẽ tạo exe Windows, nhưng chạy Pyinstaller trong Linux sẽ tạo exe Linux. Nếu bạn muốn tạo exe cho nhiều hệ điều hành, bạn sẽ phải xem xét việc sử dụng máy ảo hoặc sử dụng một thứ gì đó như Wine .


Các chương trình sau đây đều hoạt động tương tự - chúng kết hợp Python và chương trình của bạn, kết hợp chúng một cách hiệu quả để tạo ra tệp thực thi.

  • PyInstaller:

    • Liên kết : Trang web || Repo || PyPi
    • Hỗ trợ : Python 2.7 và Python 3.4 - 3.7 trên Windows, Mac và Linux.
  • cx_Freeze:

    • Liên kết: Trang web || Repo || PyPi
    • Hỗ trợ: Python 2.7 và 3.5 - 3.8 trên Windows, Mac và Linux.
  • py2app:

    • Liên kết: Trang web || Repo || PyPi
    • Hỗ trợ: Python 2.7 và 3.3 (?) - 3.7 (?) Chỉ trên Mac.
    • Lưu ý: Trong lần chỉnh sửa cuối cùng của tôi, tôi đã không thể xác định chính xác phạm vi chính xác của các phiên bản Python được pyapp hỗ trợ. Bản phát hành mới nhất đề cập đến việc hỗ trợ Python 3.7.

Lưu ý: các phiên bản trước của bài đăng này bao gồm ghi lên cho py2exe ( repo ) và bbfreeze ( repo ). Cả hai dự án đều đã bị xóa khỏi danh sách này: chúng đã không thấy hoạt động nào trong vài năm và dường như hoàn toàn không có vấn đề gì. Xem lịch sử chỉnh sửa cho các bản ghi cũ.


Tất nhiên, đó không phải là cách duy nhất để làm mọi việc:

  • pynsist:

    • Liên kết: Trang web || Repo || PyPi
    • Hỗ trợ: Tất cả các phiên bản Python? Lưu ý - sẽ chỉ tạo trình cài đặt Windows .
    • Lưu ý khác: Pynsist dường như hỗ trợ gộp bất kỳ phiên bản Python tùy ý nào với ứng dụng của bạn. Tuy nhiên, bản thân công cụ này yêu cầu Python 3.5+ để chạy.

      Pynsist sẽ tạo trình cài đặt Windows cho chương trình của bạn, trình cài đặt này sẽ trực tiếp cài đặt Python trên máy tính của người dùng thay vì gói nó với mã của bạn và tạo các phím tắt liên kết đến tập lệnh Python của bạn. Mặc dù chương trình này chỉ sản xuất trình cài đặt Windows, nhưng có vẻ như bạn vẫn có thể chạy Pynsist trên máy tính Mac và Linux.

  • Nuitka:

    • Liên kết: Trang web || Repo (Github mirror) || PyPi
    • Hỗ trợ: Python 2.6 - 2.7 và Python 3.3 - 3.7 trên Windows, Mac và Linux.
    • Các lưu ý khác: Nuitka sẽ biên dịch mã Python của bạn theo nghĩa đen và tạo ra một exe (trái ngược với các dự án khác, chỉ bao gồm Python) để thử và tăng tốc mã của bạn. Như một tác dụng phụ, bạn cũng sẽ nhận được một exe hữu ích mà bạn có thể phân phối. Lưu ý rằng bạn cần có một trình biên dịch C ++ trên hệ thống của mình.
  • cython:

    • Liên kết: Trang web || Repo || PyPi
    • Hỗ trợ: Python 2.6 - 2.7 và Python 3.2 - 3.8 trên Windows, Mac và Linux.
    • Lưu ý khác: Cython tương tự như Nuitka ở chỗ nó là một trình biên dịch Python. Tuy nhiên, thay vì biên dịch trực tiếp mã của bạn, nó sẽ biên dịch nó sang C. Sau đó, bạn có thể lấy mã C đó và biến mã của bạn thành exe . Bạn sẽ cần có một trình biên dịch C có sẵn trên hệ thống của mình.

Sở thích cá nhân của tôi là sử dụng PyInstaller vì nó là cách dễ nhất để tôi thiết lập và chạy, được thiết kế để hoạt động độc đáo với các thư viện phổ biến khác nhau như numpy hoặc pygame và có khả năng tương thích tốt với các hệ điều hành và phiên bản Python khác nhau.

Tuy nhiên, tôi cũng đã xây dựng thành công các exes khác nhau bằng cx_Freeze mà không gặp quá nhiều khó khăn, vì vậy bạn cũng nên cân nhắc dùng thử chương trình đó.

Tôi chưa có cơ hội thử rộng rãi pynist, Nuitka hoặc Cython, nhưng chúng có vẻ là những giải pháp khá thú vị và sáng tạo. Nếu bạn gặp sự cố khi sử dụng nhóm chương trình đầu tiên, bạn nên thử một trong ba chương trình này. Vì chúng hoạt động về cơ bản khác với các chương trình kiểu Pyinstaller / cx_freeze, chúng có thể thành công trong những trường hợp cạnh kỳ quặc mà nhóm đầu tiên không thành công.

Đặc biệt, tôi nghĩ pynist là một cách tốt để tránh toàn bộ vấn đề phân phối toàn bộ mã của bạn: Mac và Linux đã có hỗ trợ gốc cho Python và chỉ cần cài đặt Python trên Windows có thể thực sự là giải pháp sạch sẽ nhất. (Nhược điểm là bây giờ bạn cần phải lo lắng về việc nhắm mục tiêu nhiều phiên bản Python + cài đặt thư viện).

Nuitka và Cython (theo kinh nghiệm hạn chế của tôi) dường như hoạt động khá tốt. Một lần nữa, tôi đã không tự mình thử nghiệm chúng một cách rộng rãi, và vì vậy quan sát chính của tôi là chúng dường như mất nhiều thời gian hơn để tạo ra một exe thì các chương trình kiểu "đóng băng" sẽ làm được.


Tất cả điều này đang được nói, chuyển đổi chương trình Python của bạn thành một tệp thực thi không nhất thiết là cách duy nhất để phân phối mã của bạn. Để tìm hiểu thêm về những tùy chọn khác có sẵn, hãy xem các liên kết sau:


1
Lưu ý rằng bạn cũng cần phải bao gồm trong gói của bạn Microsoft C ++ Redistributables (aka msvcrxx.dll, nơi xxlà một số phiên bản) để làm cho chạy .exe (hoặc yêu cầu người dùng cài đặt nó bằng cách tự). Điều này là cần thiết vì Python được xây dựng trên Windows bằng Visual Studio.
hào hoa

Vì vậy, có vẻ như không có IDE nào của python (pycharm hoặc pydev - eclipse plugggin) vẫn chưa kết hợp chức năng biên dịch thành một tệp thực thi vào chính IDE. Đúng không? :-)
Nelda.techspiress.

Nếu bạn quan tâm đến việc giữ an toàn cho mã nguồn của mình, có lẽ Cython là lựa chọn tốt nhất vì nó biên dịch mã C. Những chương trình sử dụng kỹ thuật đóng băng nói chung có thể dễ dàng dịch ngược.
Martín De la Fuente

PyInstaller được liệt kê ở trên là hỗ trợ Python 3.7. Điều đó không đúng theo kinh nghiệm của tôi và theo mô tả tại pyinstaller.org, trong đó nói rằng "PyInstaller hoạt động với Python 2.7 và 3.3—3.6".
Tom

1
@Tom - Sau khi đào thêm một chút, có vẻ như mặc dù bản thân pyinstaller hỗ trợ Python 3.7 nhưng họ vẫn chưa chính thức phát hành phiên bản mới có hỗ trợ 3.7. (Ví dụ: repo github của họ nói rằng họ hỗ trợ Python 3.7 +, họ dường như không có vấn đề mở nào liên quan đến 3.7, nhưng phiên bản mới nhất của pyinstaller trên PyPi là từ tháng 12 năm 2017). Vì vậy, nếu bạn cần hỗ trợ 3.7, bạn có thể thử xây dựng + cài đặt pyinstaller trực tiếp từ nguồn hoặc đợi cho đến bản phát hành tiếp theo. (Hoặc sử dụng chương trình khác, tất nhiên)
Michael0x2a

10

pyinstaller vẫn đang được phát triển tích cực. Bạn có thể xem những thay đổi mới nhất trên GitHub.

Nó có hỗ trợ cho cả ba nền tảng chính:

  • Windows (32-bit và 64-bit)
  • Linux (32-bit và 64-bit)
  • Mac OS X (32-bit và 64-bit)

và nó hỗ trợ phiên bản Python 2.6 và 2.7. Nó không hỗ trợ Python 3, nhưng có một nhánh Python 3 thử nghiệm .

Cập nhật

Kể từ phiên bản 3.2.1, nó hỗ trợ Python 2.7, 3.3-3.5


2

Sử dụng tốt hơn pip install auto-py-to-execung cấp giao diện người dùng đẹp với tất cả các tùy chọn cần thiết để tạo tệp thực thi.

Sau khi cài đặt, chỉ cần nhập auto-py-to-exethiết bị đầu cuối hoặc dấu nhắc lệnh của bạn.

Auto-py-to-exe


cảm ơn bạn vẫn trả lời trên một chủ đề cũ như chủ đề này. Có vẻ là một phát hiện đáng kinh ngạc và thực sự đơn giản hóa công việc khi thiết lập, cũng như cung cấp lệnh được sử dụng thực tế: D
ShadowFlame
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.