Python, potężny i wszechstronny, jak to jest, brakuje kilku kluczowych możliwości po wyjęciu z pudełka. Po pierwsze, Python nie zapewnia natywnego mechanizmu kompilacji programu Pythona do samodzielnego pakietu wykonywalnego.

aby być uczciwym, oryginalny przypadek użycia Pythona nigdy nie wymagał samodzielnych pakietów. Programy Pythona były w zasadzie uruchamiane na systemach, w których żyła Kopia interpretera Pythona. Jednak rosnąca popularność Pythona spowodowała większe zapotrzebowanie na uruchamianie aplikacji Pythona na systemach bez zainstalowanego środowiska wykonawczego Pythona.,

kilka firm trzecich opracowało rozwiązania do wdrażania autonomicznych aplikacji Pythona. Najpopularniejszym rozwiązaniem grupy i najbardziej dojrzałym jest PyInstaller. PyInstaller nie sprawia, że proces pakowania aplikacji Python iść całkowicie bezbolesne, ale to idzie długą drogę tam.

w tym artykule omówimy podstawy korzystania z PyInstaller, w tym jak działa PyInstaller, jak używać PyInstaller do tworzenia samodzielnego pliku wykonywalnego Pythona, jak dostroić Pliki Wykonywalne Pythona, które tworzysz, i jak uniknąć niektórych typowych pułapek, które go z użyciem PyInstaller.,

Tworzenie pakietu PyInstaller

PyInstaller jest pakietem Pythona, zainstalowanym zpip (pip install pyinstaller). PyInstaller można zainstalować w domyślnej instalacji Pythona, ale najlepiej jest utworzyć środowisko wirtualne dla projektu, który chcesz spakować i zainstalować PyInstaller tam.

PyInstaller działa, czytając Twój program Pythona, analizując wszystkie importowane przez niego pliki i łącząc kopie tych importów z Twoim programem. PyInstaller czyta w programie z punktu wejścia., Na przykład, jeśli punktem wejścia programu jest myapp.py, należy uruchomić pyinstaller myapp.py, aby przeprowadzić analizę. PyInstaller może wykrywać i automatycznie pakować wiele popularnych pakietów Pythona, takich jak NumPy, ale w niektórych przypadkach może być konieczne dostarczenie podpowiedzi. (Więcej na ten temat później.)

Po przeanalizowaniu kodu i odkryciu wszystkich bibliotek i modułów, których używa, PyInstaller generuje „plik spec.”Skrypt Pythona z rozszerzeniem .spec, ten plik zawiera szczegółowe informacje o tym, jak aplikacja Pythona musi być spakowana., Po raz pierwszy uruchomić PyInstaller w aplikacji, PyInstaller wygeneruje plik specyfikacji od podstaw i wypełnić go z niektórych rozsądnych domyślnych. Nie odrzucaj tego pliku; jest to klucz do udoskonalenia wdrożenia Pyinstallera!

wreszcie, PyInstaller próbuje stworzyć plik wykonywalny z aplikacji, w pakiecie ze wszystkimi jego zależnościami. Po jego zakończeniu w katalogu projektu pojawi się podfolder o nazwie dist (domyślnie; możesz podać inną nazwę)., To z kolei zawiera katalog, który jest dołączoną aplikacją-ma plik .exe do uruchomienia, wraz ze wszystkimi bibliotekami i innymi wymaganymi dodatkowymi plikami.

wszystko, co musisz zrobić, aby rozpowszechnić swój program, to spakować ten katalog jako plik .zip lub inny pakiet. Pakiet zazwyczaj musi być wyodrębniony w katalogu, w którym Użytkownik ma uprawnienia do zapisu, aby uruchomić.

IDG

A .plik spec służy do tworzenia pliku wykonywalnego z PyInstaller., Zwróć uwagę na przestrzenie nazw wymienione w excludes. Zostaną one pominięte w utworzonym pakiecie, aby zaoszczędzić miejsce.

testowanie pakietu PyInstaller

istnieje spora szansa, że pierwsza próba użycia PyInstaller do spakowania aplikacji nie zakończy się całkowitym sukcesem.

aby sprawdzić, czy Twój Pakiet PyInstaller działa, przejdź do katalogu zawierającego dołączony plik wykonywalny i uruchom plik.exe z linii poleceń., Jeśli nie uda się uruchomić, błędy, które zobaczysz wydrukowane w wierszu poleceń, powinny zawierać podpowiedź, co jest nie tak.

najczęstszym powodem niepowodzenia pakietu PyInstaller jest to, że PyInstaller nie powiódł się spakować wymaganego pliku. Takie brakujące pliki dzielą się na kilka kategorii:

  • Ukryte lub brakujące import: czasami PyInstaller nie może wykryć importu pakietu lub biblioteki, zazwyczaj dlatego, że jest importowany dynamicznie. Pakiet lub biblioteka muszą być określone ręcznie.,
  • brakujące samodzielne pliki: jeśli program zależy od zewnętrznych plików danych, które muszą być dołączone do programu, PyInstaller nie ma możliwości poznania. Musisz ręcznie dołączyć pliki.
  • brakujące pliki binarne: tutaj ponownie, jeśli twój program zależy od zewnętrznego pliku binarnego, takiego jak a .DLL, którego PyInstaller nie może wykryć, musisz ręcznie dołączyć go.

dobrą wiadomością jest to, że PyInstaller zapewnia łatwy sposób radzenia sobie z powyższymi problemami., Plik.spec Utworzony przez PyInstaller zawiera pola, które możemy wypełnić, aby podać szczegóły, które pyinstaller pominął.

Otwórz plik.spec w edytorze tekstu i poszukaj definicji obiektuAnalysis. Kilka parametrów przekazywanych do Analysis to puste listy, ale można je edytować, aby określić brakujące szczegóły:

  • hiddenimports dla ukrytych lub brakujących importów: Dodaj do tej listy jeden lub więcej łańcuchów z nazwami bibliotek, które chcesz dołączyć do aplikacji., Jeśli chcesz dodać pandas I bokeh, na przykład, możesz określić to jako . Zauważ, że biblioteki, o których mowa, muszą być zainstalowane w tej samej instancji Pythona, w której uruchamiasz PyInstaller.
  • datas dla brakujących plików samodzielnych: Dodaj tutaj jedną lub więcej specyfikacji plików w drzewie projektu, które chcesz dołączyć do projektu., Każdy plik musi być przekazany jako krotka wskazująca względną ścieżkę do pliku w katalogu projektu i względną ścieżkę w katalogu dystrybucji, w którym chcesz umieścić plik. Na przykład, jeśli Masz plik ./models/mainmodel.dat, który chcesz dołączyć do swojej aplikacji i chcesz umieścić go w pasującym podkatalogu w katalogu dystrybucji, użyjesz ('./models/mainmodel.dat','./models')jako jednego wpisu na liściehiddenimports. Zauważ, że możesz użyć symboli wieloznacznych w stylu glob, aby określić więcej niż jeden plik.,
  • binaries dla brakujących samodzielnych binariów: tak jak w przypadku datas, możesz użyćbinaries, aby przekazać listę krotek określających lokalizacje binariów w drzewie projektu i ich miejsca docelowe w katalogu dystrybucji. Ponownie możesz użyćglob-style wildcards.

należy pamiętać, że każda z list przekazywanych do Analysismoże być programowo wygenerowana wcześniej w pliku .spec., W końcu plik .spec jest tylko skryptem Pythona o innej nazwie.

Po wprowadzeniu zmian w pliku.spec uruchom ponownie program PyInstaller, aby odbudować pakiet. Od teraz należy jednak podawać jako parametr zmodyfikowany plik .spec (np. pyinstaller myapp.spec). Przetestuj plik wykonywalny jak poprzednio. Jeśli coś jest nadal zepsute, możesz ponownie edytować plik .spec I powtarzać proces, aż wszystko zadziała.,

na koniec, gdy będziesz mieć pewność, że wszystko działa zgodnie z przeznaczeniem, możesz edytować plik .spec, aby zapobiec wyświetlaniu okna linii poleceń w pakiecie po uruchomieniu. W EXE ustawienia obiektu w pliku .spec Ustaw console=False. Wyłączenie konsoli jest przydatne, jeśli aplikacja ma GUI i nie chcesz, aby fałszywe okno wiersza poleceń prowadziło użytkowników na manowce. Oczywiście nie zmieniaj tego ustawienia, jeśli aplikacja wymaga wiersza poleceń.,

Ulepszanie pakietu PyInstaller

po spakowaniu aplikacji z PyInstaller i prawidłowym uruchomieniu, następną rzeczą, którą prawdopodobnie chcesz zrobić, to odchudzić ją trochę. Pakiety PyInstaller nie są znane z tego, że są smukłe.

ponieważ Python jest językiem dynamicznym, trudno jest przewidzieć, co będzie potrzebne w czasie pracy danego programu. Z tego powodu, gdy PyInstaller wykrywa import pakietu, zawiera wszystko w tym pakiecie, czy jest on rzeczywiście używany w czasie wykonywania przez program.

oto dobra wiadomość., PyInstaller zawiera mechanizm selektywnego wyłączania całych pakietów lub pojedynczych przestrzeni nazw w pakietach. Na przykład, załóżmy, że twój program importuje pakiet foo, który zawiera foo.barI foo.bip. Jeśli wiesz na pewno, że twój program używa tylko logiki w foo.bar, możesz bezpiecznie wykluczyć foo.bip I zaoszczędzić trochę miejsca.

aby to zrobić, należy użyć parametruexcludes przekazanego do obiektuAnalysis w pliku.spec., Możesz przekazać listę nazw-modułów najwyższego poziomu lub przerywanych przestrzeni nazw — aby wykluczyć z pakietu. Na przykład, aby wykluczyć foo.bip, wystarczy podać .

IDG

dostarczany katalog stworzony przez PyInstaller. Ze względu na dużą liczbę plików w katalogu, projekt instalatora innej firmy, taki jak NSIS, może być użyty do spakowania katalogu do samorozpakowującego się archiwum i automatycznego utworzenia skrótu do pliku wykonywalnego.,

jednym powszechnym wykluczeniem, które możesz zrobić, jesttkinter, Biblioteka Pythona do tworzenia prostych wieloplatformowych graficznych interfejsów użytkownika. Domyślnie tkinter I wszystkie jego pliki pomocnicze są pakowane z projektem PyInstaller. Jeśli nie używasz tkinter w swoim projekcie, możesz go wykluczyć, dodając 'tkinter'do listy excludes. Pominięcie tkinter zmniejszy rozmiar pakietu o około 7 MB.

innym powszechnym wykluczeniem są pakiety testowe., Jeśli importowany przez program pakiet zawiera pakiet testowy, pakiet testowy może zostać dołączony do pakietu PyInstaller. Jeśli nie uruchomisz pakietu testowego w wdrożonym programie, możesz go bezpiecznie wykluczyć.

należy pamiętać, że pakiety utworzone przy użyciu wykluczeń powinny zostać dokładnie przetestowane przed ich użyciem. Jeśli w końcu wyłączysz funkcjonalność, która jest używana w jakimś przyszłym scenariuszu, którego nie przewidziałeś, aplikacja ulegnie awarii.

porady PyInstaller

  • Zbuduj swój pakiet PyInstaller na systemie operacyjnym, na którym planujesz wdrożyć., PyInstaller nie obsługuje kompilacji wieloplatformowych. Jeśli chcesz wdrożyć samodzielną aplikację Pythona na systemach MacOS, Linux i Windows, musisz zainstalować PyInstaller i zbudować oddzielne wersje aplikacji na każdym z tych systemów operacyjnych.
  • Zbuduj swój pakiet PyInstaller podczas tworzenia aplikacji. Jak tylko dowiesz się, że będziesz wdrażać swój projekt za pomocą PyInstaller, Zbuduj swój plik .spec I rozpocznij udoskonalanie pakietu PyInstaller równolegle z rozwojem aplikacji., W ten sposób możesz dodawać wykluczenia lub wtrącenia w trakcie pracy i testować, w jaki sposób nowe funkcje są wdrażane w aplikacji podczas ich pisania.
  • nie używaj trybu Pyinstallera--onefile. PyInstaller zawiera przełącznik wiersza poleceń, --onefile, który pakuje całą aplikację do jednego samorozpakowującego się pliku wykonywalnego. Brzmi to jak świetny pomysł — musisz DOSTARCZYĆ tylko jeden plik! – ale ma pewne pułapki. Po uruchomieniu aplikacji należy najpierw rozpakować wszystkie pliki w katalogu tymczasowym., Jeśli aplikacja jest duża (np. 200MB), rozpakowanie może oznaczać kilkusekundowe opóźnienie. Zamiast tego użyj domyślnego trybu pojedynczego katalogu i po prostu spakuj wszystko jako plik .zip.
  • Utwórz instalator dla aplikacji PyInstaller. Jeśli chcesz wdrożyć aplikację w inny sposób niż a .plik zip, rozważ użycie narzędzia instalatora, takiego jak open source Nullsoft Scriptable Install System. Dodaje bardzo niewiele narzutu do rozmiaru pliku dostarczanego i pozwala skonfigurować wiele aspektów procesu instalacji, takich jak tworzenie skrótów do pliku wykonywalnego.,
  • nie oczekuj speedupów. PyInstaller jest systemem pakowania, a nie kompilatorem lub optymalizatorem. Kod spakowany z PyInstaller nie działa szybciej niż w oryginalnym systemie. Jeśli chcesz przyspieszyć kod Pythona, użyj biblioteki z akceleracją C dostosowanej do zadania lub projektu takiego jak Cython.,w aby przyspieszyć Pythona
  • Jak zainstalować Pythona w inteligentny sposób
  • lepsze zarządzanie projektami Pythona za pomocą poezji
  • Virtualenv i venv: objaśnione środowiska wirtualne Pythona
  • objaśnione wątki i podprocesy Pythona
  • Jak używać debuggera Pythona
  • Jak używać timeit do profilowania kodu Pythona
  • Jak używać cprofile do profilowania kodu Pythona
  • zacznij używać async w Pythonie
  • jak używać asyncio w Pythonie
  • Jak przekonwertować Pythona na JavaScript (i z powrotem)