Programavimas

Kaip naudoti „PyInstaller“, norint sukurti „Python“ vykdomuosius failus

„Python“, koks yra galingas ir universalus, trūksta kelių pagrindinių galimybių. Pirma, „Python“ nepateikia jokio savaiminio „Python“ programos kompiliavimo į atskirą vykdomąjį paketą mechanizmo.

Teisybės dėlei reikia pasakyti, kad originalus „Python“ naudojimo atvejis niekada nereikalavo atskirų paketų. Apskritai „Python“ programos buvo vykdomos sistemose, kuriose gyveno „Python“ vertėjo kopija. Tačiau sparčiai populiarėjantis „Python“ sukėlė didesnę paklausą paleisti „Python“ programas sistemose, kuriose nėra įdiegto „Python“ vykdymo laiko.

Kelios trečiosios šalys sukūrė sprendimus, kaip įdiegti atskiras „Python“ programas. Populiariausias ir brandžiausias krūvos sprendimas yra „PyInstaller“. „PyInstaller“ nereikalauja, kad „Python“ programos pakavimo procesas vyktų visiškai neskausmingai, tačiau ten einama ilgą kelią.

Šiame straipsnyje mes išnagrinėsime „PyInstaller“ naudojimo pagrindus, įskaitant tai, kaip veikia „PyInstaller“, kaip naudoti „PyInstaller“ norint sukurti atskirą „Python“ vykdomąjį failą, kaip tiksliai sureguliuoti sukurtus „Python“ vykdomuosius failus ir kaip išvengti kai kurių dažniausiai pasitaikančių spąstų. naudojant „PyInstaller“.

„PyInstaller“ paketo kūrimas

PyInstaller yra „Python“ paketas, įdiegtas kartu su pip (įdiegti pyinstaller). „PyInstaller“ galima įdiegti į numatytąjį „Python“ diegimą, tačiau geriausia sukurti virtualią aplinką projektui, kurį norite supakuoti, ir ten įdiegti „PyInstaller“.

„PyInstaller“ veikia skaitydamas „Python“ programą, analizuodamas visus importuojamus duomenis ir susiedamas tų importų kopijas su programa. „PyInstaller“ nuskaito jūsų programą nuo jos įėjimo taško. Pavyzdžiui, jei jūsų programos įėjimo taškas yra myapp.py, bėgtum pyinstaller myapp.py atlikti analizę. „PyInstaller“ gali aptikti ir automatiškai supakuoti daugelį įprastų „Python“ paketų, pvz., „NumPy“, tačiau kai kuriais atvejais gali tekti pateikti užuominų. (Daugiau apie tai vėliau.)

Išanalizavęs kodą ir atradęs visas jo naudojamas bibliotekas ir modulius, „PyInstaller“ sukuria „spec failą“. „Python“ scenarijus su plėtiniu .spec, šiame faile yra išsami informacija apie tai, kaip reikia supakuoti jūsų „Python“ programą. Pirmą kartą paleidę „PyInstaller“ savo programoje, „PyInstaller“ sugeneruos specifikacijos failą nuo nulio ir užpildys jį protingais numatytaisiais nustatymais. Neišmeskite šio failo; tai raktas tobulinant „PyInstaller“ diegimą!

Galiausiai „PyInstaller“ bando iš programos sukurti vykdomąjį failą kartu su visomis priklausomybėmis. Kai jis bus baigtas, poaplankis pavadintas dist (pagal numatytuosius nustatymus; galite laisvai nurodyti kitą pavadinimą) atsiras projekto kataloge. Savo ruožtu yra katalogas, kuris yra jūsų susieta programa - jis turi .exe paleisti failą, kartu su visomis reikalingomis bibliotekomis ir kitais papildomais failais.

Tada viskas, ką jums reikia padaryti norint išplatinti programą, yra supakuoti šį katalogą kaip .zip failą ar kokį kitą paketą. Kad būtų galima paleisti, rinkinį paprastai reikės išgauti kataloge, kuriame vartotojas turi rašymo teises.

„PyInstaller“ paketo testavimas

Yra didelė tikimybė, kad pirmasis bandymas naudoti „PyInstaller“ programai supakuoti nebus visiškai sėkmingas.

Norėdami patikrinti, ar jūsų „PyInstaller“ paketas veikia, eikite į katalogą, kuriame yra susietas vykdomasis failas, ir paleiskite .exe failą iš komandinės eilutės. Jei nepavyksta paleisti, klaidos, kurias matysite atspausdintos komandinėje eilutėje, turėtų pateikti užuominą, kas yra negerai.

Dažniausia „PyInstaller“ paketo gedimo priežastis yra ta, kad „PyInstaller“ nepavyko susieti reikiamo failo. Tokie trūkstami failai skirstomi į kelias kategorijas:

  • Paslėptas arba trūksta importo: Kartais „PyInstaller“ negali aptikti paketo ar bibliotekos importavimo, paprastai todėl, kad jis importuojamas dinamiškai. Paketą ar biblioteką reikės nurodyti rankiniu būdu.
  • Trūksta atskirų failų: Jei programa priklauso nuo išorinių duomenų failų, kuriuos reikia susieti su programa, „PyInstaller“ negali žinoti. Turėsite rankiniu būdu įtraukti failus.
  • Trūksta dvejetainių failų: Čia dar kartą, jei jūsų programa priklauso nuo išorinio dvejetainio failo, pvz., .DLL, kurio „PyInstaller“ negali aptikti, turėsite jį įtraukti rankiniu būdu.

Geros naujienos yra tai, kad „PyInstaller“ suteikia paprastą būdą išspręsti minėtas problemas. .spec „PyInstaller“ sukurtame faile yra laukai, kuriuos galime užpildyti, kad pateiktų išsamią informaciją, kurią „PyInstaller“ praleido.

Atidaryk .spec failą teksto rengyklėje ir ieškokite Analizė objektas. Keletas parametrų perduoti Analizė yra tušti sąrašai, tačiau juos galima redaguoti, norint nurodyti trūkstamą informaciją:

  • paslėptas importas už paslėptą ar trūkstamą importą: Įtraukite į šį sąrašą vieną ar daugiau eilučių su bibliotekų, kurias norite įtraukti į savo programą, pavadinimais. Jei norėtum pridėti pandos ir bokeh, pavyzdžiui, jūs nurodytumėte tai kaip['pandos', 'bokeh']. Atkreipkite dėmesį, kad aptariamos bibliotekos turi būti įdiegti tame pačiame „Python“ egzemplioriuje, kuriame naudojate „PyInstaller“.
  • duomenys už tai, kad trūksta atskirų failų: Pridėkite čia vieną ar daugiau failų specifikacijų savo projekto medyje, kurias norite įtraukti į savo projektą. Kiekvienas failas turi būti perduotas kaip kartelis, nurodantis santykinį failo kelią jūsų projekto kataloge ir santykinį kelią paskirstymo kataloge, kuriame norite įdėti failą. Pavyzdžiui, jei turite failą ./models/mainmodel.dat kurį norėjote įtraukti į savo programą ir norite įdėti jį į atitinkamą pakatalogį savo platinimo kataloge, naudosite ('./models/mainmodel.dat','./models') kaip vieną įrašą paslėptasimportas sąrašą. Atminkite, kad galite naudoti globstiliaus pakaitos nurodyti daugiau nei vieną failą.
  • dvejetainiai failai už tai, kad trūksta atskirų dvejetainių failų: Kaip ir su duomenys, tu gali naudoti dvejetainiai failai perduoti rinkinių sąrašą, kuriame nurodomos dvejetainių failų vietos projekto medyje ir jų paskirties vietos paskirstymo kataloge. Vėlgi, galite naudoti globstiliaus pakaitos.

Atminkite, kad bet kuris iš sąrašų perduotas Analizė gali būti programiškai sugeneruotas anksčiau .spec failą. Galų gale .spec failas yra tik „Python“ scenarijus kitu vardu.

Atlikę pakeitimus .spec failą, paleiskite „PyInstaller“ iš naujo, kad atkurtumėte paketą. Tačiau nuo šiol būtinai perduokite modifikuotą .spec failas kaip parametras (pvz. pyinstaller myapp.spec). Išbandykite vykdomąjį failą kaip ir anksčiau. Jei kažkas vis dar sugedo, galite iš naujo redaguoti .spec failą ir kartokite procesą, kol viskas veiks.

Galiausiai, kai esate patenkinti, viskas veikia taip, kaip numatyta, galbūt norėsite redaguoti.spec failą, kad paketinė programa nepaleistų komandinės eilutės lango. Viduje konors EXE objekto parametrai .spec failas, rinkinyskonsolė = klaidinga. Konsolės slopinimas yra naudingas, jei jūsų programoje yra GUI ir nenorite, kad netikras komandinės eilutės langas klaidintų vartotojus. Žinoma, nekeiskite šio nustatymo, jei programai reikalinga komandinė eilutė.

„PyInstaller“ paketo tobulinimas

Kai jūsų programa bus supakuota su „PyInstaller“ ir tinkamai veiks, kitas dalykas, kurį greičiausiai norėsite padaryti, yra šiek tiek sumažinti. Nežinoma, kad „PyInstaller“ paketai yra švelnūs.

Kadangi „Python“ yra dinamiška kalba, sunku nuspėti, ko konkrečiai programai reikės vykdymo metu. Dėl šios priežasties, kai „PyInstaller“ aptinka paketo importavimą, jis apima viskas tame pakete, neatsižvelgiant į tai, ar jūsų programa jį tikrai naudoja vykdymo metu.

Štai geros naujienos. „PyInstaller“ apima mechanizmą, leidžiantį selektyviai pašalinti ištisus paketus ar atskirus paketus vardų sritis pakuotėse. Tarkime, tarkime, kad jūsų programa importuoja paketą foo, kuris apima foo.baras ir foo.bip. Jei tikrai žinote, kad jūsų programa naudoja tik logiką foo.baras, galite saugiai atmesti foo.bip ir sutaupyti šiek tiek vietos.

Norėdami tai padaryti, naudokite neįtraukia parametras perduotas Analizė objektas .spec failą. Galite perduoti vardų sąrašą - aukščiausio lygio modulius arba punktyrines vardų sritis -, kuriuos norite pašalinti iš savo paketo. Pavyzdžiui, kad neįtrauktų foo.bip, paprasčiausiai nurodytumėte['foo.bip'].

Viena iš įprastų išimčių, kurias galite padaryti, yra tkinter, „Python“ biblioteka, skirta kurti paprastas kelių platformų grafines vartotojo sąsajas. Pagal numatytuosius nustatymustkinter ir visi jos palaikymo failai yra supakuoti su „PyInstaller“ projektu. Jei nenaudojate tkinter savo projekte galite jo išskirti pridėdami „tkinter“ į neįtraukia sąrašą. Praleidimas tkinter sumažins pakuotės dydį maždaug 7 MB.

Kita paplitusi išimtis yra bandomieji rinkiniai. Jei jūsų programos importuotame pakete yra testavimo paketas, testų paketas gali būti įtrauktas į jūsų „PyInstaller“ paketą. Jei iš tikrųjų paleisite testų paketą savo įdiegtoje programoje, galite jį saugiai išskirti.

Atminkite, kad paketai, sukurti naudojant išskyrimus, prieš juos turėtų būti kruopščiai išbandyti. Jei galų gale neįtrauksite funkcijų, kurios naudojamos tam tikruose ateities scenarijuose, kurių nenumatėte, jūsų programa suges.

„PyInstaller“ patarimai

  • Sukurkite „PyInstaller“ paketą OS, kurioje planuojate diegti. „PyInstaller“ nepalaiko kelių platformų versijų. Jei jums reikia įdiegti atskirą „Python“ programą „MacOS“, „Linux“ ir „Windows“ sistemose, turėsite įdiegti „PyInstaller“ ir kiekvienoje iš šių operacinių sistemų sukurti atskiras programos versijas.
  • Sukurkite „PyInstaller“ paketą, kai kuriate programą. Kai tik žinosite, kad diegsite savo projektą su „PyInstaller“, sukurkite savo .spec failą ir pradėkite tobulinti „PyInstaller“ paketą kartu su savo programos kūrimu. Tokiu būdu galite pridėti išskyrimų ar įtraukimų eidami ir išbandydami naujų funkcijų diegimo programą, kai jas rašote.
  • Nenaudokite „PyInstaller“--vienas failas režimas. PyInstaller apima komandinės eilutės jungiklį, --vienas failas, kuris supakuoja visą jūsų programą į vieną savaime išsiskiriantį vykdomąjį failą. Tai skamba kaip puiki idėja - turite pateikti tik vieną failą! - bet jis turi tam tikrų spąstų. Kai paleidžiate programą, ji pirmiausia turi išpakuoti visus vykdomojo failo failus į laikiną katalogą. Jei programa yra didelė (pavyzdžiui, 200 MB), išpakavimas gali reikšti kelių sekundžių vėlavimą. Vietoj to naudokite numatytąjį vieno katalogo režimą ir tiesiog supakuokite viską kaip .zip failą.
  • Sukurkite „PyInstaller“ programos diegimo programą. Jei norite kokiu nors būdu įdiegti programą, išskyrus .zip failą, apsvarstykite galimybę naudoti diegimo priemonę, pvz., Atvirojo kodo „Nullsoft Scriptable Install System“. Tai prideda labai nedaug pridėtinių rezultatų ir leidžia sukonfigūruoti daugelį diegimo proceso aspektų, pvz., Sukurti sparčiuosius klavišus į vykdomąjį failą.
  • Nesitikėkite greičio viršijimo. „PyInstaller“ yra apakuotės sistema, o ne asudarytojasarba anoptimizatorius. Kodas, supakuotas su „PyInstaller“, neveikia greičiau nei būtų paleistas originalioje sistemoje. Jei norite pagreitinti „Python“ kodą, naudokite „C“ pagreitintą biblioteką, tinkamą užduočiai, arba projektą, pvz., „Cython“.

Kaip padaryti daugiau su „Python“

  • „Cython“ pamoka: kaip pagreitinti „Python“
  • Kaip įdiegti „Python“ išmaniuoju būdu
  • Geresnis „Python“ projektų valdymas naudojant „Poetry“
  • „Virtualenv“ ir „venv“: paaiškintos „Python“ virtualios aplinkos
  • „Python virtualenv“ ir „venv do and donts“
  • Paaiškinta „Python“ sriegimas ir antriniai procesai
  • Kaip naudotis „Python“ derintuvu
  • Kaip naudoti „Timeit“, kad būtų galima nustatyti „Python“ kodą
  • Kaip naudoti „cProfile“ „Python“ kodui nustatyti
  • Pradėkite naudoti „Python“ asinchronizavimą
  • Kaip naudoti „asyncio“ Python
  • Kaip konvertuoti „Python“ į „JavaScript“ (ir dar kartą)