Làm cách nào để phân phối các chương trình python?


102

Ứng dụng của tôi trông như thế này:

main.py
các cửa sổ/
    __init__.py
    mainwindow.py
    ...
mô hình/
    __init__.py
    order.py
    ...
tài nguyên/
    image1.png
    logo.jpg
    ...

Chương trình được bắt đầu với main.py. Có cách nào tốt để tạo ứng dụng 'cuối cùng' từ nó không? Tôi đang nghĩ đến một cái gì đó giống như py2exe / py2app, nhưng không sao chép trình thông dịch / mô-đun python vào ứng dụng nơi chỉ có một tệp thực thi.

Tôi đã xem qua các bản phân phối, nhưng điều này có vẻ như nó cài đặt một chương trình vào thư mục Python, điều này không thường thấy trên các nền tảng không phải Linux.

Hiện tại, tôi chỉ cần sao chép toàn bộ thư mục nguồn vào máy mục tiêu và tạo một bí danh main.pywtrên windows. Một số bất tiện:

  • Biểu tượng là biểu tượng con trăn mặc định.
  • Tôi phải tạo bí danh theo cách thủ công.
  • Trong thư mục nguồn của tôi có rất nhiều tệp bổ sung như thư mục điều khiển nguồn.
  • Tôi phải đổi tên main.pythành main.pywthủ công.
  • Sẽ thật tuyệt nếu chỉ có các tệp `.pyo * trên máy đích. Không có lý do thực sự cho nó, tôi chỉ không thích có các tệp không cần thiết.

Làm cách nào để tạo một bản phân phối tự động đẹp mắt?

  • cho cửa sổ? (Đó là nền tảng duy nhất mà tôi phải hỗ trợ vào lúc này.)
  • cho mac?
  • cho linux?

2
"Tôi đã xem qua các bản phân phối, nhưng điều này có vẻ như nó cài đặt một chương trình vào thư mục Python, điều này không bình thường trên các nền tảng không phải Linux." Tại sao bạn lại nói như vậy? Bạn đã đọc văn bản nào nói điều đó? Nó chắc chắn là sai sự thật, bạn lấy ấn tượng đó ở đâu?
S.Lott


Câu trả lời:


37

Theo cách thông thường của việc phân phối các ứng dụng Python là với distutils . Nó được tạo ra để phân phối các mô-đun python loại thư viện và ứng dụng python, mặc dù tôi không biết nó hoạt động như thế nào trên Windows. Trên Windows, bạn phải cài đặt riêng Python nếu bạn sử dụng các bản phân phối, trong mọi trường hợp.

Tôi có lẽ khuyên bạn nên phân phối nó với disutils cho Linux và Py2exe hoặc một cái gì đó tương tự cho Windows. Đối với OS XI không biết. Nếu đó là một ứng dụng người dùng cuối, bạn có thể muốn một loại hình ảnh đĩa, tôi không biết làm thế nào để làm điều đó. Nhưng hãy đọc bài đăng này để biết thêm thông tin về trải nghiệm người dùng của nó. Đối với một ứng dụng dành cho các lập trình viên, bạn có thể cũng OK với kiểu cài đặt bản phân phối trên OS X.


1
Mac và linux lúc này không còn quan trọng nữa. Py2app tạo các gói .app. Và tôi nghĩ rằng vận chuyển các ứng dụng mac ở dạng .dmg đã lỗi thời, người ta nên sử dụng .zip. Có thể sử dụng distutils để chỉ tạo một thư mục distvà sao chép tất cả các tệp có liên quan vào đó không?
Georg Schölly

1
@gs: lệnh sdist sẽ tạo một tệp tar của tất cả các tệp nguồn.
Martin kiện Löwis

5
@gs: Vận chuyển ứng dụng Mac ở dạng .dmg thực sự rất phổ biến. .dmg là hình ảnh đĩa và không phải là định dạng cho các ứng dụng (đó sẽ là .app). Do đó, bạn thường tìm thấy một .app duy nhất bên trong .dmg, cùng với một số tệp README.
Eric O Lebigot 13/10/09

2
@gs Tôi không biết tại sao bạn muốn distutils chỉ tạo một thư mục dist và sao chép các tệp vào đó, bạn có thể tự làm điều đó. Distutils làm được rất nhiều thứ, bao gồm cả tạo trình cài đặt cửa sổ và từ Python 2.6 cũng tạo liên kết trong menu Start. Tuy nhiên, nó sẽ yêu cầu bạn cài đặt Python riêng biệt, vì vậy đối với ứng dụng người dùng cuối, tôi nghĩ py2exe là giải pháp tốt hơn, nó bao gồm Python của riêng nó. Việc vận chuyển / cài đặt OS X đã được Alexander Limi thảo luận chi tiết trong bài đăng trên blog của anh ấy, vì vậy tôi hoãn lại với anh ấy.
Lennart Regebro 13/10/09


61

Tôi thực sự khuyên dùng Pyinstaller , hỗ trợ tất cả các nền tảng chính khá liền mạch. Giống như py2exe và py2app, nó tạo ra tệp thực thi tiêu chuẩn trên Windows và gói ứng dụng trên OS X, nhưng cũng có lợi ích là thực hiện một công việc tuyệt vời là tự động giải quyết các phần phụ thuộc phổ biến và bao gồm chúng mà không cần chỉnh sửa thêm cấu hình.

Cũng lưu ý rằng nếu bạn đang triển khai Python 2.6 cho Windows, bạn nên áp dụng bản vá này cho thân cây Pyinstaller.

Bạn đã chỉ ra rằng bạn không cần trình cài đặt, nhưng Inno Setup là một lựa chọn dễ sử dụng và cài đặt nhanh chóng cho nền tảng Windows.


3
Tôi không chắc rằng nó là quá mức cần thiết. Việc gộp một ứng dụng với Pyinstaller thực sự có thể dễ dàng hơn các phương pháp khác, đặc biệt là các phương pháp phụ thuộc vào phần mở rộng c ... đơn giản như một lệnh gọi dòng lệnh trong hầu hết các trường hợp. Việc cài đặt Python + các phụ thuộc + bản thân ứng dụng (cho dù thông qua các bản phân phối, v.v. hay chỉ là một tệp zip) sẽ được tham gia nhiều hơn, đặc biệt nếu nhà phát triển không thể tự định cấu hình máy mục tiêu theo cách thủ công và cần cung cấp hướng dẫn cho máy khách. Ít nhất là trên Windows, tôi nghĩ rằng phong cách phân phối đó có ý nghĩa.
Daniel Naab

1
Một chút bất tiện với pyinstaller, khi bạn sử dụng tệp thực thi được tạo bằng pyinstaller, việc bắt đầu thực thi sẽ mất vài giây.
JuanPablo,

1
Chính xác những gì tôi đang tìm kiếm. Đôi khi tôi cần để các tập lệnh của mình chạy trên máy tính mà tôi không thể cài đặt bất kỳ thứ gì. Một tệp thực thi duy nhất không có phụ thuộc bên ngoài là những gì tôi cần. Tôi có thể dành một vài giây để khởi động. Cảm ơn bạn!
CodeMonkey

Không được khuyến nghị cho các ứng dụng nhỏ, vì một Hello worldchương trình đơn giản sẽ chiếm 500 MB dung lượng và thời gian khởi tạo 3-5 giây.
Raf

Bạn có thể tránh số tiền này của không gian bằng cách sử dụng một môi trường riêng biệt để phân phối ứng dụng của bạn (Sử dụng venv hoặc pyenv, ví dụ)
Alexander Santos

4

Fredrik Lundh's squeeze.py có thể tạo một tệp duy nhất không chứa trình thông dịch Python, mà thay vào đó chứa mã bytecode. Với các đối số phù hợp, bạn có thể bao gồm các tệp, mô-đun, v.v. khác trong tệp kết quả. Tôi đã sử dụng nó thành công trong một dự án. Chương trình kết quả chạy trên OS X, Linux và Windows mà không gặp bất kỳ sự cố nào!

Tái bút : Mỗi máy cần phải có một trình thông dịch Python tương thích với mã bytecode được tạo bởiquee.py. Bạn có thể tạo các phiên bản bytecode khác nhau cho các phiên bản Python khác nhau, nếu cần (chỉ cần chạyquee.py với phiên bản Python phù hợp).


4

Tôi nghĩ cũng nên đề cập đến PEX (xem xét nhiều hơn sự chú ý mà câu hỏi này nhận được và ít câu hỏi hơn). Theo mô tả riêng của nó :

Tệp PEX là môi trường ảo Python thực thi độc lập. Cụ thể hơn, chúng là các tệp zip được xây dựng cẩn thận với một #!/usr/bin/env pythonvà đặc biệt __main__.pycho phép bạn tương tác với thời gian chạy PEX. Để biết thêm thông tin về các ứng dụng zip, hãy xem PEP 441 .

Tôi tình cờ gặp nó khi tôi đọc tổng quan về đóng gói cho python . Họ đã đăng bức ảnh đẹp này ở đó: nhập mô tả hình ảnh ở đây

Tóm lại: Nếu bạn đủ khả năng dựa vào python đang được cài đặt trên máy đích, hãy sử dụng PEX để tạo tệp thực thi »tự chứa« có thể sẽ có kích thước tệp nhỏ hơn tệp thực thi được tạo bởi PyInstaller chẳng hạn.



1

Nếu bạn đang phân phối trên windows, hãy sử dụng trình cài đặt để cài đặt tất cả các tệp liên quan / interpeter bất cứ thứ gì cần thiết. Phân phối một setup.exe. Đó là cách tốt nhất trên windows. Nếu không người dùng sẽ phàn nàn.


1
Tôi không cần trình cài đặt vì chỉ có một người dùng sẽ sử dụng chương trình. Nhưng tất nhiên khi viết một chương trình cho nhiều người dùng hơn đó là điều bắt buộc phải có trên windows.
Georg Schölly

1
@gs: Ồ, chỉ có một người dùng. Tốt thôi, vậy thì tôi khuyên bạn nên tạo một gói distutils cơ bản, một bản phân phối nguồn hoặc một trình cài đặt nhị phân windows. Đó chắc chắn là một cách dễ dàng và hay để phân phối một mô-đun Python.
Lennart Regebro

0

Cách thuận tiện nhất * đa nền tảng để phân phối các ứng dụng máy tính để bàn python là dựa vào trình quản lý gói conda đa nền tảng. Có một số công cụ sử dụng nó:

  • Miniconda-Install - các tập lệnh powershell / bash tự động tải xuống Miniconda và tạo môi trường chung cư biệt lập cho ứng dụng. Hỗ trợ pip nhưng dường như không rõ ràng và có sự cố tải xuống https.
  • Dự án Anaconda và phương thức khởi tạo (conda) bằng Continuum. Cả hai đều sử dụng chung cư. (conda) constructor dường như có thể tạo các trình cài đặt độc lập và thậm chí cả trình cài đặt NSIS trên Windows nhưng không hỗ trợ pip. Có vẻ hoạt động giống như trình cài đặt Anaconda / Miniconda.
  • PyAppShare - người dùng cuối cài đặt Miniconda / Anaconda trước (giống như môi trường thời gian chạy). Sau đó, tập lệnh batch / bash cài đặt đơn sẽ tạo ra môi trường conda bị cô lập từ thông số yaml. Ứng dụng này cũng là một gói conda / pip được cài đặt vào môi trường và một điểm vào thực thi được tạo. Các lối tắt trên Máy tính để bàn và Chương trình đa nền tảng được tạo tự động. Họ kích hoạt môi trường và khởi động ứng dụng. Hỗ trợ pip.

* Thuận tiện nhất cho chủ đầu tư. Đủ thuận tiện cho người dùng cuối.

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.