Utwórz pojedynczy plik wykonywalny z projektu w języku Python

87

Chcę utworzyć pojedynczy plik wykonywalny z mojego projektu w języku Python. Użytkownik powinien mieć możliwość pobrania i uruchomienia go bez konieczności instalowania języka Python. Gdybym tylko rozprowadzał pakiet, mógłbym użyć pip, wheel i PyPI, aby go zbudować i rozprowadzić, ale wymaga to od użytkownika posiadania Pythona i umiejętności instalowania pakietów. Czego mogę użyć do zbudowania samodzielnego pliku wykonywalnego z projektu w języku Python?

ShadowFlame
źródło
Nadal piszę w wersji 2.x (dokładnie 2.7.2), ale mogę zobaczyć potrzebę przejścia na 3.x (jeśli moduły i takie są kompatybilne) i wtedy też potrzebowałbym rozwiązania.
ShadowFlame,
Należy pamiętać, że opakowanie znacznie skomplikuje diagnostykę problemu. Nie tylko ty (lub pdb) nie masz łatwego dostępu do wykonywanych plików, py2exe(nie wiem o innych) nie zawiera .pyplików, więc nie zobaczysz linii źródłowych w śladach stosu.
ivan_pozdeev
Jako ciekawostkę zacząłem używać pyinstaller
ShadowFlame

Odpowiedzi:

115

Oto kilka typowych. O ile nie zaznaczono inaczej, wszystkie wymienione poniżej projekty są aktywnie obsługiwane od mojej ostatniej edycji (styczeń 2020 r.).

Dołączyłem również linki do ich odpowiednich stron internetowych, repozytoriów i list PyPi, na wypadek gdybyś chciał sam sprawdzić, jak często są aktualizowane.

Ponadto, o ile nie zaznaczono inaczej, wszystkie programy wymienione poniżej utworzą plik exe specjalnie dla systemu operacyjnego, w którym działa. Na przykład uruchomienie Pyinstaller w systemie Windows spowoduje utworzenie pliku exe systemu Windows, ale uruchomienie Pyinstaller w systemie Linux da plik exe systemu Linux. Jeśli chcesz stworzyć exe dla wielu systemów operacyjnych, będziesz musiał przyjrzeć się użyciu maszyn wirtualnych lub użyć czegoś takiego jak Wine .


Wszystkie poniższe programy działają podobnie - łączą Python i Twój program, skutecznie łącząc je w celu utworzenia pliku wykonywalnego.

  • PyInstaller:

  • cx_Freeze:

  • py2app:

    • Linki: Strona internetowa || Repo || PyPi
    • Obsługuje: Python 2.7 i 3.3 (?) - 3.7 (?) Tylko na komputerach Mac.
    • Uwaga: od ostatniej edycji nie udało mi się jednoznacznie określić dokładnego zakresu wersji Pythona obsługiwanych przez pyapp. Najnowsza wersja wspomina o obsłudze Pythona 3.7.

Uwaga: wcześniejsze wersje tego posta zawierały zapisy dotyczące py2exe ( repo ) i bbfreeze ( repo ). Oba projekty zostały usunięte z tej listy: od kilku lat nie odnotowano w nich żadnej aktywności i wydaje się, że nie są one utrzymywane. Zobacz historię zmian starych zapisów.


Oczywiście nie jest to jedyny sposób:

  • pynsist:

    • Linki: Strona internetowa || Repo || PyPi
    • Obsługuje: wszystkie wersje Pythona? Uwaga - utworzy tylko instalatory Windows .
    • Inne uwagi: Wydaje się, że Pynsist obsługuje łączenie dowolnej dowolnej wersji Pythona z twoją aplikacją. Jednak samo narzędzie wymaga do działania języka Python 3.5+.

      Pynsist utworzy instalator Windows dla twojego programu, który bezpośrednio zainstaluje Pythona na komputerze użytkownika, zamiast łączyć go z twoim kodem i tworzyć skróty, które prowadzą do twojego skryptu Pythona. Chociaż ten program tworzy tylko instalatory systemu Windows, wydaje się, że nadal można uruchomić Pynsist na komputerach Mac i Linux.

  • Nuitka:

    • Linki: Strona internetowa || Repo (lustro Github) || PyPi
    • Obsługuje: Python 2.6 - 2.7 i Python 3.3 - 3.7 w systemach Windows, Mac i Linux.
    • Inne uwagi: Nuitka dosłownie skompiluje Twój kod Pythona i utworzy plik exe (w przeciwieństwie do innych projektów, które po prostu zawierają Pythona), aby spróbować przyspieszyć Twój kod. Jako efekt uboczny otrzymasz także poręczny plik exe, który możesz rozpowszechniać. Zauważ, że musisz mieć dostępny kompilator C ++ w swoim systemie.
  • cython:

    • Linki: Strona internetowa || Repo || PyPi
    • Obsługuje: Python 2.6 - 2.7 i Python 3.2 - 3.8 w systemach Windows, Mac i Linux.
    • Inne uwagi: Cython jest podobny do Nuitka, ponieważ jest kompilatorem Pythona. Jednak zamiast bezpośrednio kompilować kod, skompiluje go do C. Możesz następnie wziąć ten kod w C i przekształcić go w plik exe . Musisz mieć kompilator C w swoim systemie.

Osobiście wolę używać PyInstaller, ponieważ był on dla mnie najłatwiejszy do uruchomienia, został zaprojektowany tak, aby dobrze współpracował z różnymi popularnymi bibliotekami, takimi jak numpy lub pygame, i ma doskonałą kompatybilność z różnymi wersjami systemów operacyjnych i Pythona.

Jednak z powodzeniem zbudowałem również różne exe przy użyciu cx_Freeze bez większych trudności, więc powinieneś również rozważyć wypróbowanie tego programu.

Nie miałem jeszcze okazji wypróbować na szeroką skalę pynistów, Nuitki czy Cythona, ale wydają się one całkiem ciekawymi i nowatorskimi rozwiązaniami. Jeśli napotkasz problemy podczas korzystania z pierwszej grupy programów, warto wypróbować jeden z tych trzech. Ponieważ działają one zasadniczo inaczej niż programy w stylu Pyinstaller / cx_freeze, mogą odnieść sukces w tych dziwnych skrajnych przypadkach, w których pierwsza grupa zawodzi.

W szczególności uważam, że pynist to dobry sposób na obejście całego problemu dystrybucji kodu w ogóle: komputery Mac i Linux mają już natywną obsługę Pythona, a samo zainstalowanie Pythona w systemie Windows może być naprawdę najczystszym rozwiązaniem. (Wadą jest teraz, że musisz się martwić o kierowanie na wiele wersji Pythona + instalowanie bibliotek).

Nuitka i Cython (z mojego ograniczonego doświadczenia) wydają się działać dość dobrze. Ponownie, nie testowałem ich szczegółowo, więc moja główna obserwacja jest taka, że ​​wydaje się, że tworzenie exe trwa znacznie dłużej niż programy w stylu "zamrażania".


Biorąc to wszystko pod uwagę, konwersja programu w Pythonie na plik wykonywalny niekoniecznie jest jedynym sposobem dystrybucji kodu. Aby dowiedzieć się więcej o innych dostępnych opcjach, skorzystaj z poniższych łączy:

Michael0x2a
źródło
1
Należy pamiętać, że trzeba także zawierać wewnątrz zwijaj Microsoft C ++ Redystrybucyjne (aka msvcrxx.dll, gdzie xxjest numer wersji), aby uruchomić exe (lub poprosić użytkowników, aby zainstalować go przez siebie). Jest to konieczne, ponieważ Python jest zbudowany w systemie Windows przy użyciu programu Visual Studio.
hałaśliwy
Wygląda więc na to, że żadne z pythonowych IDE (pycharm lub pydev - eclipse pluggin) nie zawierało jeszcze funkcji kompilacji do pojedynczego pliku wykonywalnego w samym IDE. Czy to jest poprawne? :-)
Nelda.techspiress
Jeśli zależy Ci na bezpieczeństwie kodu źródłowego, prawdopodobnie Cython jest najlepszym wyborem, ponieważ kompiluje kod C. Te programy, które używają techniki zamrażania , ogólnie można łatwo zdekompilować.
Martín De la Fuente
PyInstaller jest wymieniony powyżej jako obsługujący Python 3.7. Nie jest to prawdą na podstawie mojego doświadczenia i zgodnie z opisem na stronie pyinstaller.org, w którym stwierdza się, że „PyInstaller działa z Pythonem 2.7 i 3.3–3.6”.
Tom
1
@Tom - Wygląda na to, że chociaż sam pyinstaller obsługuje Python 3.7, nie wydali oficjalnie nowej wersji z obsługą 3.7. (Np. Ich repozytorium github stwierdza, że ​​obsługują Python 3.7 +, wydaje się, że nie mają żadnych otwartych problemów związanych z 3.7, ale najnowsza wersja pyinstaller na PyPi pochodzi z grudnia 2017). Więc jeśli potrzebujesz wsparcia w wersji 3.7, możesz spróbować zbudować + zainstalować pyinstaller bezpośrednio ze źródła lub poczekać do następnej wersji. (Lub oczywiście użyj innego programu)
Michael0x2a
10

pyinstaller jest nadal w fazie rozwoju. Najnowsze zmiany możesz zobaczyć na GitHub.

Obsługuje wszystkie trzy główne platformy:

  • Windows (32-bitowy i 64-bitowy)
  • Linux (32-bitowy i 64-bitowy)
  • Mac OS X (32-bitowy i 64-bitowy)

i obsługuje Python w wersjach 2.6 i 2.7. Nie obsługuje Pythona 3, ale istnieje eksperymentalna gałąź Python 3 .

Aktualizacja

Od wersji 3.2.1 obsługuje Python 2.7, 3.3-3.5

jterrace
źródło
2

Lepsze wykorzystanie, pip install auto-py-to-exektóre zapewnia piękny interfejs użytkownika ze wszystkimi opcjami wymaganymi do utworzenia pliku wykonywalnego.

Po zainstalowaniu wystarczy wpisać auto-py-to-exeterminal lub wiersz poleceń.

Auto-py-to-exe

Ratnesh Kushwaha
źródło
dziękuję za udzielanie odpowiedzi w tak starym wątku jak ten. Wygląda na niesamowite znalezisko i naprawdę upraszcza pracę podczas konfigurowania, a także zapewnia faktycznie używane polecenie: D
ShadowFlame