Jak mogę rozpowszechniać programy w języku Python?

102

Moja aplikacja wygląda tak:

main.py
okna /
    __init__.py
    mainwindow.py
    ...
Model/
    __init__.py
    orders.py
    ...
zasoby/
    image1.png
    logo.jpg
    ...

Program jest uruchamiany z main.py. Czy istnieje dobry sposób na stworzenie z tego „ostatecznego” wniosku? Myślę o czymś takim jak py2exe / py2app, ale bez kopiowania interpretera / modułów Pythona do aplikacji, w której jest tylko jeden plik wykonywalny.

Rzuciłem okiem na distutils, ale wygląda na to, że instaluje program w katalogu Pythona, co nie jest typowe na platformach innych niż Linux.

W tej chwili po prostu kopiuję cały folder źródłowy na komputer docelowy i tworzę alias do main.pyww systemie Windows. Niektóre niedogodności:

  • Ikona jest domyślną ikoną języka Python.
  • Muszę utworzyć alias ręcznie.
  • W moim katalogu źródłowym znajduje się wiele dodatkowych plików, takich jak folder kontroli źródła.
  • Muszę zmienić nazwę main.pyna main.pywręcznie.
  • Byłoby miło, gdyby na maszynie docelowej były tylko pliki `.pyo *. Nie ma ku temu żadnego powodu, po prostu nie lubię mieć niepotrzebnych plików.

Jak stworzyć ładną automatyczną dystrybucję?

  • dla Windowsa? (To jedyna platforma, którą w tej chwili muszę obsługiwać).
  • dla Maca?
  • dla linuxa?
Georg Schölly
źródło
2
„Rzuciłem okiem na distutils, ale wygląda na to, że instaluje program w katalogu Pythona, co nie jest typowe na platformach innych niż Linux.” Dlaczego tak mówisz? Jaki tekst to przeczytałeś? To z pewnością nieprawda, skąd odniosłeś takie wrażenie?
S.Lott

Odpowiedzi:

37

Normalnym sposobem dystrybucji aplikacji Pythona jest dystrybucja distutils . Jest przeznaczony zarówno do dystrybucji modułów Pythona typu bibliotecznego, jak i aplikacji w Pythonie, chociaż nie wiem, jak to działa w systemie Windows. W każdym przypadku w systemie Windows musiałbyś zainstalować Pythona osobno, jeśli używasz distutils.

Prawdopodobnie zaleciłbym dystrybucję go z disutils dla Linuksa i Py2exe lub czymś podobnym dla Windows. Na OS X nie wiem. Jeśli jest to aplikacja dla użytkownika końcowego, prawdopodobnie chciałbyś mieć obraz dysku, nie wiem, jak to zrobić. Ale przeczytaj ten post, aby uzyskać więcej informacji na temat wrażeń użytkowników. W przypadku aplikacji stworzonej dla programistów prawdopodobnie nie przeszkadza Ci również instalacja typu distutils na OS X.

Lennart Regebro
źródło
1
Mac i Linux nie są w tej chwili tak ważne. Py2app tworzy pakiety .app. I myślę, że wysyłanie aplikacji na Maca w .dmg jest przestarzałe, należy użyć .zip. Czy można użyć distutils, aby po prostu utworzyć katalog disti skopiować do niego wszystkie odpowiednie pliki?
Georg Schölly
1
@gs: polecenie sdist utworzy plik tar ze wszystkimi plikami źródłowymi.
Martin v. Löwis
5
@gs: Wysyłanie aplikacji na komputery Mac w formacie .dmg jest w rzeczywistości niezwykle powszechne. .dmg to obrazy dysków, a nie format aplikacji (to byłby .app). W związku z tym często znajduje się pojedynczy plik .app w pliku .dmg, wraz z jakimś plikiem README.
Eric O Lebigot
2
@gs Nie wiem, dlaczego chcesz, aby distutils po prostu utworzył katalog dist i skopiował tam pliki, możesz to zrobić sam. Distutils robi wiele rzeczy, w tym tworzy instalatory dla systemu Windows, a od Pythona 2.6 również tworzy linki w menu Start. Będzie to jednak wymagało oddzielnego zainstalowania Pythona, więc dla aplikacji użytkownika końcowego myślę, że py2exe jest lepszym rozwiązaniem, ponieważ zawiera własny Python. Wysyłanie / instalatory dla OS X jest szczegółowo omówione przez Alexandra Limi w jego wpisie na blogu, więc ograniczam się do niego.
Lennart Regebro
61

Gorąco polecam Pyinstaller , który całkiem bezproblemowo obsługuje wszystkie główne platformy. Podobnie jak py2exe i py2app, tworzy standardowy plik wykonywalny w systemie Windows i pakiet aplikacji w systemie OS X, ale ma również tę zaletę, że wykonuje fantastyczną pracę polegającą na automatycznym rozwiązywaniu typowych zależności i włączaniu ich bez dodatkowych poprawek konfiguracyjnych.

Zauważ również, że jeśli wdrażasz Python 2.6 w systemie Windows, powinieneś zastosować tę poprawkę do łącza Pyinstaller.

Wskazałeś, że nie potrzebujesz instalatora, ale Inno Setup to łatwy w użyciu i szybki w konfiguracji wybór dla platformy Windows.

Daniel Naab
źródło
3
Nie jestem pewien, czy to przesada. Pakowanie aplikacji za pomocą Pyinstaller może być w rzeczywistości łatwiejsze niż inne metody, zwłaszcza te z zależnościami od rozszerzeń c ... tak proste, jak wywołanie w wierszu poleceń w większości przypadków. Instalowanie Pythona + zależności + samej aplikacji (czy to za pomocą distutils, itp., Czy po prostu pliku zip) jest bardziej skomplikowane, zwłaszcza jeśli programista nie jest w stanie samodzielnie skonfigurować maszyny docelowej i musi dostarczyć instrukcje klientowi. Myślę, że przynajmniej w systemie Windows ten styl dystrybucji ma sens.
Daniel Naab
1
Trochę niewygodne z pyinstaller, gdy używasz pliku wykonywalnego utworzonego za pomocą pyinstaller, rozpoczęcie wykonywania zajmuje kilka sekund.
JuanPablo
1
Dokładnie to, czego szukałem. Czasami muszę pozwolić, aby moje skrypty działały na komputerach, na których nie mogę niczego zainstalować. Potrzebuję jednego pliku wykonywalnego bez zewnętrznych zależności. Mogę poświęcić kilka sekund na uruchomienie. Dziękuję Ci!
CodeMonkey
Niezalecane dla małych aplikacji, ponieważ prosty Hello worldprogram zajmie 500 MB miejsca i czas inicjalizacji 3-5 sekund.
Raf
Możesz uniknąć takiej ilości miejsca, używając oddzielnego środowiska do dystrybucji aplikacji (na przykład przy użyciu venv lub pyenv)
Alexander Santos,
4

Fredrik Lundh squeeze.pymoże stworzyć pojedynczy plik, który nie zawiera interpretera Pythona, ale zamiast tego zawiera kod bajtowy. Mając odpowiednie argumenty, możesz dołączyć inne pliki, moduły itp. Do pliku wynikowego. Użyłem go z powodzeniem w jednym projekcie. Powstały program działał na OS X, Linux i Windows bez żadnego problemu!

PS : Każda maszyna musi mieć interpreter Pythona, który jest zgodny z kodem bajtowym generowanym przez squeeze.py. W razie potrzeby możesz wygenerować różne wersje kodu bajtowego dla różnych wersji Pythona (po prostu uruchom squeeze.py z odpowiednią wersją Pythona).

Eric O Lebigot
źródło
4

Myślę, że warto również wspomnieć o PEX (biorąc pod uwagę więcej uwagi, jaką otrzymało to pytanie, a mniej samo pytanie). Według własnego opisu :

Pliki PEX to samodzielne wykonywalne środowiska wirtualne Pythona. Mówiąc dokładniej, są to starannie skonstruowane pliki zip z dodatkiem #!/usr/bin/env pythoni specjalnym, __main__.pyktóry umożliwia interakcję ze środowiskiem wykonawczym PEX. Aby uzyskać więcej informacji o aplikacjach zip, zobacz PEP 441 .

Natknąłem się na to, kiedy przeczytałem przegląd opakowań dla Pythona . Opublikowali tam to ładne zdjęcie: wprowadź opis obrazu tutaj

Podsumowując: jeśli możesz sobie pozwolić na poleganie na zainstalowaniu Pythona na maszynie docelowej, użyj PEX, aby stworzyć samowystarczalny »plik wykonywalny«, który prawdopodobnie będzie miał mniejszy rozmiar pliku niż na przykład plik wykonywalny utworzony przez PyInstaller.

user3389669
źródło
1

Jeśli rozpowszechniasz w systemie Windows, użyj instalatora, aby zainstalować wszystkie potrzebne pliki / interpeter. Rozpowszechnij plik setup.exe. To najlepszy sposób na okna. W przeciwnym razie użytkownicy będą narzekać.

Byron Whitlock
źródło
1
Nie potrzebuję instalatora, ponieważ jest tylko jeden użytkownik, który będzie korzystał z programu. Ale oczywiście podczas pisania programu dla większej liczby użytkowników, który jest niezbędny w systemie Windows.
Georg Schölly
1
@gs: Och, tylko jeden użytkownik. W takim razie poleciłbym stworzyć podstawowy pakiet distutils, albo dystrybucję źródłową, albo instalator binarny dla systemu Windows. To zdecydowanie łatwy i przyjemny sposób na dystrybucję modułu Pythona.
Lennart Regebro
0

Najwygodniejszym * międzyplatformowym sposobem dystrybucji aplikacji desktopowych w języku Python jest korzystanie z międzyplatformowego menedżera pakietów Conda. Używa go kilka narzędzi:

  • Miniconda-Install - skrypty powershell / bash, które automatycznie pobierają Minicondę i tworzą izolowane środowisko Conda dla aplikacji. Obsługuje pip, ale wydaje się nie być konserwowany i ma problemy z pobieraniem https.
  • Projekt Anaconda i konstruktor (conda) autorstwa Continuum. Obie używają conda. (conda) konstruktor wydaje się być w stanie stworzyć samodzielne instalatory, a nawet instalator NSIS w systemie Windows, ale nie obsługuje pip. Wydaje się, że zachowują się jak instalatory Anaconda / Miniconda.
  • PyAppShare - użytkownik końcowy instaluje najpierw Miniconda / Anaconda (podobnie jak środowisko uruchomieniowe). Następnie pojedynczy skrypt instalacji wsadowej / bash tworzy izolowane środowisko Conda na podstawie specyfikacji yaml. Aplikacja jest również samym pakietem conda / pip, który jest instalowany w środowisku i tworzony jest wykonywalny punkt wejścia. Skróty międzyplatformowe pulpitu i programów są tworzone automatycznie. Aktywują środowisko i uruchamiają aplikację. Obsługuje pip.

* Najwygodniejszy dla programisty. Wystarczająco wygodne dla użytkownika końcowego.

Peter Zagubisalo
źródło