Python, puternic și versatil, așa cum este, nu are câteva capabilități cheie din cutie. Pentru unul, Python nu oferă niciun mecanism nativ pentru compilarea unui program Python într-un pachet executabil independent.

pentru a fi corect, cazul de utilizare original pentru Python nu a solicitat niciodată pachete de sine stătătoare. Programele Python au fost, în general, rulate pe sisteme în care a trăit o copie a interpretului Python. Dar popularitatea crescândă a Python a creat o cerere mai mare pentru rularea aplicațiilor Python pe sisteme fără rulare Python instalată.,

Mai multe terțe părți au proiectat soluții pentru implementarea aplicațiilor Python de sine stătătoare. Cea mai populară soluție a buchetului, și cea mai matură, este PyInstaller. PyInstaller nu face ca procesul de ambalare a unei aplicații Python să meargă complet nedureros, dar merge mult acolo.

În acest articol vom explora elementele de bază ale folosind PyInstaller inclusiv cum PyInstaller funcționează, cum să utilizați PyInstaller pentru a crea un independent Python executabile, cum de a ajusta Python executabile care le creați, și cum să evite unele dintre capcanele comune care merge cu ajutorul PyInstaller.,

Crearea unui PyInstaller pachet

PyInstaller este un pachet Python, instalat cu pip (pip install pyinstaller). PyInstaller pot fi instalate în mod implicit instalarea Python, dar cel mai bine este de a crea un mediu virtual pentru proiectul pe care doriți să pachetului și instala PyInstaller acolo.PyInstaller funcționează citind programul Python, analizând toate importurile pe care le face și grupând copii ale acestor importuri cu programul dvs. PyInstaller citește în programul dvs. de la punctul său de intrare., De exemplu, dacă punctul de intrare al programului dvs. este myapp.py, veți rula pyinstaller myapp.py pentru a efectua analiza. PyInstaller poate detecta și pachet automat mai multe pachete comune Python, cum ar fi NumPy, dar ar putea fi necesar pentru a oferi indicii, în unele cazuri. (Mai multe despre asta mai târziu.)

după analizarea codului și descoperirea tuturor bibliotecilor și modulelor pe care le utilizează, PyInstaller generează apoi un „fișier spec.”Un script Python cu extensia .spec, acest fișier include detalii despre modul în care aplicația dvs., Prima dată când rulați PyInstaller pe aplicația, PyInstaller va genera un fișier spec de la zero și popula-l cu unele sănătos implicite. Nu aruncați acest fișier; este cheia pentru rafinarea unei implementări PyInstaller!în cele din urmă, PyInstaller încearcă să producă un executabil din aplicație, la pachet cu toate dependențele sale. Când este terminat, un subfolder numit dist (în mod implicit, sunteți liber să specificați un alt nume) va apărea în directorul de proiect., Aceasta, la rândul său, conține un director care este aplicația la pachet — are un .exe fișier pentru a rula, împreună cu toate bibliotecile și alte fișiere suplimentare necesare.

tot ce trebuie să faceți pentru a distribui programul, apoi, este pachet acest director ca un .zip fișier sau un alt pachet. Pachetul va trebui de obicei să fie extras într-un director în care utilizatorul are permisiuni de scriere pentru a rula.

IDG

a .fișier spec este folosit pentru a crea un executabil cu PyInstaller., Notați spațiile de nume listate în excludes. Acestea vor fi lăsate în afara pachetului creat pentru a economisi spațiu.

Testarea unui PyInstaller pachet

Acolo este o șansă echitabilă prima încercare de a folosi PyInstaller la pachet cu o aplicație nu va fi încununată de succes.

Pentru a verifica dacă PyInstaller pachet funcționează, navigați la directorul care conține pachet executabil și a alerga .exe dosarul acolo de la linia de comandă., Dacă nu reușește să ruleze, erorile pe care le veți vedea tipărite în linia de comandă ar trebui să ofere un indiciu cu privire la ce este greșit.cel mai frecvent motiv pentru care un pachet PyInstaller nu reușește este că PyInstaller nu a reușit să grupeze un fișier necesar. Astfel de fișiere lipsă se încadrează în câteva categorii:

  • importuri ascunse sau lipsă: uneori PyInstaller nu poate detecta importul unui pachet sau bibliotecă, de obicei, deoarece este importat dinamic. Pachetul sau biblioteca va trebui să fie specificate manual.,
  • lipsă fișiere de sine stătătoare: dacă programul depinde de fișiere de date externe care trebuie să fie incluse cu programul, PyInstaller nu are nici o modalitate de a ști. Va trebui să includeți manual fișierele.
  • lipsesc binare: aici, din nou, în cazul în care programul depinde de un binar extern ca un .DLL că PyInstaller nu poate detecta, va trebui să-l includă manual.vestea bună este că PyInstaller oferă o modalitate ușoară de a face față problemelor de mai sus., .spec fișier creat de PyInstaller include câmpuri putem umple în a oferi detalii care PyInstaller ratat.

    deschideți fișierul .specîntr-un editor de text și căutați definiția obiectului Analysis. Mai multe parametrilor trecut la Analysis sunt goale liste, dar ele pot fi editate pentru a specifica detaliile lipsă:

    • hiddenimports ascunse sau lipsește importurilor: Adăugați la această listă de una sau mai multe siruri de caractere cu numele de biblioteci doriți să fie incluse cu aplicația., Dacă vrei să adaugi pandas și bokeh, de exemplu, v-ar specifica ca . Rețineți că bibliotecile în cauză trebuie să fie instalate în aceeași instanță a Python unde rulați PyInstaller.
    • datas pentru fișierele independente lipsă: adăugați aici una sau mai multe specificații pentru fișierele din arborele de proiect pe care doriți să le includeți în proiectul dvs., Fiecare fișier trebuie să fie trecut ca un tuplu care indică calea relativă a fișierului în directorul de proiect și calea relativă în directorul de distribuție în care doriți să plasați fișierul. De exemplu, dacă ai un fișier ./models/mainmodel.dat că ai vrut să includă cu aplicația dumneavoastră, și doriți să-l loc într-o potrivire subdirector în distribuție director, ar trebui să utilizați ('./models/mainmodel.dat','./models') ca o intrare în hiddenimports listă. Rețineți că puteți utilizaglob-stil metacaractere pentru a specifica mai mult de un fișier.,
    • binaries pentru lipsă de sine stătătoare binare: Ca datas, puteți folosi binaries pentru a trece o listă de tupluri care specifica locațiile de fișiere binare în proiect copac și destinațiile lor în distribuția director. Din nou, puteți utiliza glob-stil metacaractere.

    Țineți minte că oricare dintre liste trecut la Analysis poate fi programatic generate anterior în .spec fișier., La urma urmei, fișierul .spec este doar un script Python cu un alt nume.

    după ce faceți modificări la fișierul .spec, rulați din nou PyInstaller pentru a reconstrui pachetul. Cu toate acestea, de acum înainte, asigurați-vă că pentru a trece modificate .spec fișier ca parametru (de exemplu pyinstaller myapp.spec). Testați executabilul ca înainte. Dacă ceva este încă rupt, puteți reedita fișierul .spec și repetați procesul până când totul funcționează.,

    în cele din urmă, când sunteți mulțumit, totul funcționează conform destinației, este posibil să doriți să editați fișierul .spec pentru a împiedica aplicația ambalată să prezinte o fereastră de linie de comandă atunci când este lansată. În EXE setări obiect în .spec fișier, seta console=False. Suprimarea consolei este utilă dacă aplicația dvs. are o interfață grafică și nu doriți o fereastră falsă de linie de comandă care să conducă utilizatorii pe căi greșite. Desigur, nu modificați această setare dacă aplicația dvs. necesită o linie de comandă.,

    Rafinare o PyInstaller pachet

    Odată ce ai app ambalate cu PyInstaller și execută corect, următorul lucru pe care veți dori probabil să faceți este să subțire în jos un pic. Pachetele PyInstaller nu sunt cunoscute pentru a fi svelte.deoarece Python este un limbaj dinamic, este dificil să se prevadă exact ceea ce va fi necesar în timpul rulării de către un anumit program. Din acest motiv, atunci când PyInstaller detectează un pachet de import, acesta include totul în acel pachet, indiferent dacă este sau nu este de fapt folosit la runtime de programul.

    iată vestea bună., PyInstaller include un mecanism pentru excluderea selectivă a pachetelor întregi sau a spațiilor de nume individuale din pachete. De exemplu, să presupunem că programul de importurile pachet foo, care include foo.bar și foo.bip. Dacă știți că programul dvs. utilizează doar logica în foo.bar, puteți exclude în siguranță foo.bip și puteți economisi spațiu.

    Pentru a face acest lucru, utilizați excludes parametru a trecut la Analysis obiect în .spec fișier., Puteți trece o listă de nume — module de nivel superior sau spații de nume punctate-pentru a le exclude din pachet. De exemplu, pentru a exclude foo.bip, ai pur și simplu specifica .

    IDG

    livrabil director creat de PyInstaller. Din cauza numărului mare de fișiere din director, un proiect de instalare terță parte, cum ar fi NSIS, poate fi utilizat pentru a împacheta directorul într-o arhivă cu auto-extragere și pentru a crea automat o comandă rapidă către executabil.,

    într-O comună de excludere puteți face este tkinter, la bibliotecă Python pentru crearea simplă cross-platform interfețe grafice utilizator. În mod implicit, tkinter și toate fișierele sale de suport sunt ambalate cu un PyInstaller proiect. Dacă nu sunteți folosind tkinter în proiectul dumneavoastră, puteți exclude prin adăugarea 'tkinter' la excludes listă. Omiterea tkinter va reduce dimensiunea pachetului cu aproximativ 7 MB.o altă excludere comună este suitele de testare., Dacă un pachet importă programul are o suită de testare, suita de testare ar putea sfârși prin a fi incluse în pachetul PyInstaller. Cu excepția cazului în care executați efectiv suita de teste în programul dvs. implementat, îl puteți exclude în siguranță.rețineți că pachetele create folosind excluderi trebuie testate temeinic înainte de a fi utilizate. Dacă ajungeți să excludeți funcționalitatea care este utilizată într-un scenariu viitor pe care nu l-ați anticipat, aplicația dvs. se va rupe.

    sfaturi PyInstaller

    • Construiți-vă Pachetul PyInstaller pe sistemul de operare pe care intenționați să îl implementați., PyInstaller nu acceptă build-uri cross-platform. Dacă trebuie să implementați aplicația Python autonomă pe sistemele MacOS, Linux și Windows, atunci va trebui să instalați PyInstaller și să construiți versiuni separate ale aplicației pe fiecare dintre aceste sisteme de operare.
    • construiește-ți pachetul PyInstaller pe măsură ce îți dezvolți aplicația. Cât de curând va fi implementarea proiectului cu PyInstaller, construi .spec file și începe rafinarea PyInstaller pachet în paralel cu dezvoltarea de app., În acest fel, puteți adăuga excluderi sau incluziuni pe măsură ce mergeți și puteți testa modul în care sunt implementate noi funcții cu aplicația în timp ce le scrieți.
    • nu utilizați modul PyInstaller --onefile. PyInstaller include un comutator de linie de comandă, --onefile, care pachete întreaga aplicație într-un singur executabil cu auto-extragere. Aceasta sună ca o idee grozavă-trebuie doar să livrați un singur fișier! – dar are niște capcane. Ori de câte ori rulați aplicația, trebuie mai întâi să despachetați toate fișierele din executabil într-un director temporar., Dacă aplicația este mare (200MB, de exemplu), despachetarea poate însemna o întârziere de câteva secunde. Utilizați modul implicit cu un singur director și împachetați totul ca fișier .zip.
    • creați un program de instalare pentru aplicația PyInstaller. Dacă doriți o modalitate de a implementa aplicația, alta decât o .fișier zip, luați în considerare utilizarea unui utilitar de instalare, cum ar fi open source Nullsoft Scriptable Install System. Se adaugă foarte puțin deasupra capului la dimensiunea livrabil și vă permite să configurați multe aspecte ale procesului de instalare, cum ar fi crearea de comenzi rapide pentru executabil.,
    • nu vă așteptați la accelerații. PyInstaller este un sistem de ambalare, nu un compilator sau un optimizator. Cod ambalate cu PyInstaller nu se execută mai repede decât ar fi atunci când rula pe sistemul original. Dacă doriți să accelerați codul Python, utilizați o bibliotecă accelerată C potrivită pentru sarcină sau un proiect precum Cython.,w pentru a accelera Python
    • Cum de a instala Python mod inteligent
    • mai Bine Python project management cu Poezie
    • Virtualenv și venv: Python medii virtuale explicat
    • Python așa și venv do ‘s and don’ ts
    • Python threading și sub-procese explicat
    • Cum să utilizați debugger Python
    • Cum să utilizați datănu la profil cod Python
    • Cum să utilizați cProfile la profil cod Python
    • începe cu async în Python
    • Cum să utilizați asyncio în Python
    • Cum de a converti Python pentru JavaScript (și din nou)