Προγραμματισμός

Πώς να χρησιμοποιήσετε το PyInstaller για να δημιουργήσετε Python εκτελέσιμα

Η Python, ισχυρή και ευέλικτη ως έχει, δεν διαθέτει μερικές βασικές δυνατότητες. Πρώτον, η Python δεν παρέχει εγγενή μηχανισμό για τη σύνταξη ενός προγράμματος Python σε ένα αυτόνομο εκτελέσιμο πακέτο.

Για να είμαστε δίκαιοι, η αρχική περίπτωση χρήσης για την Python δεν ζήτησε ποτέ αυτόνομα πακέτα. Τα προγράμματα Python έχουν εκτελεστεί σε γενικές γραμμές σε συστήματα όπου ζούσε ένα αντίγραφο του διερμηνέα Python. Ωστόσο, η αυξανόμενη δημοτικότητα του Python έχει δημιουργήσει μεγαλύτερη ζήτηση για εκτέλεση εφαρμογών Python σε συστήματα χωρίς εγκατεστημένο χρόνο εκτέλεσης Python.

Αρκετά τρίτα μέρη έχουν σχεδιάσει λύσεις για την ανάπτυξη αυτόνομων εφαρμογών Python. Η πιο δημοφιλής λύση της δέσμης, και η πιο ώριμη, είναι η PyInstaller. Η PyInstaller δεν κάνει τη διαδικασία συσκευασίας μιας εφαρμογής Python να πηγαίνει εντελώς ανώδυνη, αλλά προχωρά πολύ.

Σε αυτό το άρθρο θα διερευνήσουμε τα βασικά στοιχεία της χρήσης του PyInstaller, συμπεριλαμβανομένου του τρόπου λειτουργίας του PyInstaller, του τρόπου χρήσης του PyInstaller για τη δημιουργία ενός αυτόνομου εκτελέσιμου Python, του τρόπου βελτίωσης των εκτελέσιμων Python που δημιουργείτε και του τρόπου αποφυγής ορισμένων από τις κοινές παγίδες που υπάρχουν με τη χρήση του PyInstaller.

Δημιουργία πακέτου PyInstaller

Το PyInstaller είναι ένα πακέτο Python, εγκατεστημένο με κουκούτσι (pip install pyinstaller). Το PyInstaller μπορεί να εγκατασταθεί στην προεπιλεγμένη εγκατάσταση Python, αλλά είναι καλύτερο να δημιουργήσετε ένα εικονικό περιβάλλον για το έργο που θέλετε να συσκευάσετε και να εγκαταστήσετε το PyInstaller εκεί.

Το PyInstaller λειτουργεί διαβάζοντας το πρόγραμμά σας Python, αναλύοντας όλες τις εισαγωγές που πραγματοποιεί και συνδυάζοντας αντίγραφα αυτών των εισαγωγών με το πρόγραμμά σας. Το PyInstaller διαβάζει στο πρόγραμμά σας από το σημείο εισόδου του. Για παράδειγμα, εάν το σημείο εισόδου του προγράμματος είναι myapp.py, θα τρέξατε pyinstaller myapp.py για να πραγματοποιήσει την ανάλυση. Το PyInstaller μπορεί να εντοπίσει και να συσκευάσει αυτόματα πολλά κοινά πακέτα Python, όπως το NumPy, αλλά ίσως χρειαστεί να παρέχετε συμβουλές σε ορισμένες περιπτώσεις. (Περισσότερα για αυτό αργότερα.)

Αφού αναλύσει τον κώδικά σας και ανακαλύψει όλες τις βιβλιοθήκες και τις ενότητες που χρησιμοποιεί, το PyInstaller δημιουργεί ένα "αρχείο προδιαγραφών". Ένα σενάριο Python με την επέκταση .spec, αυτό το αρχείο περιλαμβάνει λεπτομέρειες σχετικά με τον τρόπο συσκευασίας της εφαρμογής Python. Την πρώτη φορά που θα εκτελέσετε το PyInstaller στην εφαρμογή σας, το PyInstaller θα δημιουργήσει ένα αρχείο προδιαγραφών από το μηδέν και θα το συμπληρώσει με κάποιες λογικές προεπιλογές. Μην απορρίψετε αυτό το αρχείο. είναι το κλειδί για τη βελτίωση μιας ανάπτυξης PyInstaller!

Τέλος, το PyInstaller προσπαθεί να δημιουργήσει ένα εκτελέσιμο από την εφαρμογή, σε συνδυασμό με όλες τις εξαρτήσεις του. Όταν τελειώσει, ονομάζεται ένας υποφάκελος απόσπασμα (από προεπιλογή, μπορείτε να καθορίσετε ένα διαφορετικό όνομα) θα εμφανιστεί στον κατάλογο έργου. Αυτό με τη σειρά του περιέχει έναν κατάλογο που είναι η ομαδοποιημένη εφαρμογή σας - έχει .exe αρχείο για εκτέλεση, μαζί με όλες τις βιβλιοθήκες και άλλα συμπληρωματικά αρχεία που απαιτούνται.

Το μόνο που χρειάζεται να κάνετε για να διανείμετε το πρόγραμμά σας, λοιπόν, είναι να πακετάρετε αυτόν τον κατάλογο ως .φερμουάρ αρχείο ή κάποια άλλη δέσμη. Το πακέτο θα πρέπει συνήθως να εξαχθεί σε έναν κατάλογο όπου ο χρήστης έχει δικαιώματα εγγραφής για να εκτελεστεί.

Δοκιμή πακέτου PyInstaller

Υπάρχει μια καλή πιθανότητα η πρώτη σας προσπάθεια να χρησιμοποιήσετε το PyInstaller για τη συσκευασία μιας εφαρμογής δεν θα είναι απολύτως επιτυχής.

Για να ελέγξετε αν το πακέτο PyInstaller λειτουργεί, μεταβείτε στον κατάλογο που περιέχει το πακέτο εκτελέσιμο και εκτελέστε το .exe αρχείο εκεί από τη γραμμή εντολών. Εάν δεν εκτελεστεί, τα λάθη που θα δείτε τυπωμένα στη γραμμή εντολών θα πρέπει να παρέχουν μια υπόδειξη για το τι είναι λάθος.

Ο πιο συνηθισμένος λόγος αποτυχίας ενός πακέτου PyInstaller είναι ότι το PyInstaller απέτυχε να ομαδοποιήσει ένα απαιτούμενο αρχείο. Τέτοια αρχεία που λείπουν εμπίπτουν σε μερικές κατηγορίες:

  • Κρυφές ή ελλιπείς εισαγωγές: Μερικές φορές το PyInstaller δεν μπορεί να εντοπίσει την εισαγωγή ενός πακέτου ή μιας βιβλιοθήκης, συνήθως επειδή εισάγεται δυναμικά. Το πακέτο ή η βιβλιοθήκη θα πρέπει να καθοριστεί χειροκίνητα.
  • Λείπουν αυτόνομα αρχεία: Εάν το πρόγραμμα εξαρτάται από εξωτερικά αρχεία δεδομένων που πρέπει να συνδυαστούν με το πρόγραμμα, το PyInstaller δεν έχει κανέναν τρόπο να γνωρίζει. Θα πρέπει να συμπεριλάβετε τα αρχεία με μη αυτόματο τρόπο.
  • Λείπουν δυαδικά αρχεία: Και πάλι, εάν το πρόγραμμά σας εξαρτάται από ένα εξωτερικό δυαδικό όπως το .DLL που δεν μπορεί να εντοπίσει το PyInstaller, θα πρέπει να το συμπεριλάβετε χειροκίνητα.

Τα καλά νέα είναι ότι το PyInstaller παρέχει έναν εύκολο τρόπο αντιμετώπισης των παραπάνω προβλημάτων. ο .spec Το αρχείο που δημιουργήθηκε από το PyInstaller περιλαμβάνει πεδία που μπορούμε να συμπληρώσουμε για να παρέχουμε τις λεπτομέρειες που έχασε το PyInstaller.

Ανοιξε το .spec αρχείο σε ένα πρόγραμμα επεξεργασίας κειμένου και αναζητήστε τον ορισμό του Ανάλυση αντικείμενο. Αρκετές από τις παραμέτρους πέρασαν Ανάλυση είναι κενές λίστες, αλλά μπορούν να επεξεργαστούν για να καθορίσουν τις λεπτομέρειες που λείπουν:

  • κρυφές εισαγωγές για κρυφές ή ελλείπουσες εισαγωγές: Προσθέστε σε αυτήν τη λίστα μία ή περισσότερες συμβολοσειρές με τα ονόματα των βιβλιοθηκών που θέλετε να συμπεριληφθούν στην εφαρμογή σας. Αν θέλετε να προσθέσετε pandas και bokeh, για παράδειγμα, θα το καθορίσετε ως['pandas', 'bokeh']. Σημειώστε ότι οι εν λόγω βιβλιοθήκες πρέπει να εγκατασταθεί στην ίδια παρουσία του Python όπου εκτελείτε το PyInstaller.
  • δεδομένα για λείπουν αυτόνομα αρχεία: Προσθέστε εδώ μία ή περισσότερες προδιαγραφές για αρχεία στο δέντρο έργου που θέλετε να συμπεριλάβετε στο έργο σας. Κάθε αρχείο πρέπει να περάσει ως πλειάδα που δείχνει τη σχετική διαδρομή προς το αρχείο στον κατάλογο του έργου σας και τη σχετική διαδρομή στον κατάλογο διανομής όπου θέλετε να τοποθετήσετε το αρχείο. Για παράδειγμα, εάν είχατε ένα αρχείο ./models/mainmodel.dat που θέλετε να συμπεριλάβετε στην εφαρμογή σας και θέλετε να το τοποθετήσετε σε έναν αντίστοιχο υποκατάλογο στον κατάλογο διανομής σας, θα χρησιμοποιούσατε ('./models/mainmodel.dat','./models') ως μία καταχώριση στο κρυφές εισαγωγές λίστα. Σημειώστε ότι μπορείτε να χρησιμοποιήσετε σφαίρα-στυλ μπαλαντέρ για να καθορίσετε περισσότερα από ένα αρχεία.
  • δυαδικά αρχεία για απουσία αυτόνομων δυαδικών αρχείων: Οπως και με δεδομένα, μπορείς να χρησιμοποιήσεις δυαδικά αρχεία για να περάσετε μια λίστα με πλειάδες που καθορίζουν τις θέσεις των δυαδικών στο δέντρο έργου και τους προορισμούς τους στον κατάλογο διανομής. Και πάλι, μπορείτε να χρησιμοποιήσετε σφαίρα- μπαλαντέρ στυλ

Λάβετε υπόψη ότι οποιεσδήποτε από τις λίστες πέρασαν Ανάλυση μπορεί να δημιουργηθεί μέσω προγραμματισμού νωρίτερα στο .spec αρχείο. Μετά από όλα, το .spec Το αρχείο είναι απλώς ένα σενάριο Python με άλλο όνομα.

Αφού κάνετε αλλαγές στο .spec αρχείο, εκτελέστε ξανά το PyInstaller για να δημιουργήσετε ξανά το πακέτο. Ωστόσο, από τώρα και στο εξής, φροντίστε να περάσετε τα τροποποιημένα .spec αρχείο ως παράμετρος (π.χ. pyinstaller myapp.spec). Δοκιμάστε το εκτελέσιμο όπως πριν. Εάν κάτι εξακολουθεί να είναι σπασμένο, μπορείτε να επεξεργαστείτε ξανά το .spec αρχείο και επαναλάβετε τη διαδικασία μέχρι να λειτουργήσουν όλα.

Τέλος, όταν είστε ικανοποιημένοι, όλα λειτουργούν όπως προορίζεται, ίσως θελήσετε να επεξεργαστείτε το.spec αρχείο για να αποτρέψετε την παρουσίαση της συσκευασμένης εφαρμογής σας από ένα παράθυρο γραμμής εντολών κατά την εκκίνηση. Στο EXE ρυθμίσεις αντικειμένων στο .spec αρχείο, σετκονσόλα = Λάθος. Η καταστολή της κονσόλας είναι χρήσιμη εάν η εφαρμογή σας διαθέτει GUI και δεν θέλετε ένα πλαστό παράθυρο γραμμής εντολών που οδηγεί τους χρήστες να παραπλανούν. Φυσικά, μην αλλάξετε αυτήν τη ρύθμιση εάν η εφαρμογή σας απαιτεί γραμμή εντολών.

Βελτίωση ενός πακέτου PyInstaller

Μόλις η εφαρμογή σας συσκευαστεί με PyInstaller και λειτουργεί σωστά, το επόμενο πράγμα που πιθανότατα θα θέλετε να κάνετε είναι να το μειώσετε λίγο. Τα πακέτα PyInstaller δεν είναι γνωστά για το ότι είναι svelte.

Επειδή η Python είναι μια δυναμική γλώσσα, είναι δύσκολο να προβλέψουμε τι θα χρειαστεί κατά το χρόνο εκτέλεσης από ένα συγκεκριμένο πρόγραμμα. Για το λόγο αυτό, όταν το PyInstaller εντοπίζει μια εισαγωγή πακέτου, περιλαμβάνει τα παντα σε αυτό το πακέτο, ανεξάρτητα από το εάν χρησιμοποιείται ή όχι κατά την εκτέλεση από το πρόγραμμά σας.

Εδώ είναι τα καλά νέα. Το PyInstaller περιλαμβάνει έναν μηχανισμό αποκλεισμού επιλεκτικά ολόκληρων πακέτων ή μεμονωμένων ατόμων χώροι ονομάτων εντός πακέτων. Για παράδειγμα, ας υποθέσουμε ότι το πρόγραμμά σας εισάγει πακέτο Φοο, το οποίο περιλαμβάνει foo.bar και foo.bip. Εάν γνωρίζετε για το γεγονός ότι το πρόγραμμά σας χρησιμοποιεί λογική μόνο foo.bar, μπορείτε να αποκλείσετε με ασφάλεια foo.bip και εξοικονομήστε χώρο.

Για να το κάνετε αυτό, χρησιμοποιείτε το αποκλείει παράμετρος πέρασε στο Ανάλυση αντικείμενο στο .spec αρχείο. Μπορείτε να περάσετε μια λίστα ονομάτων - μονάδες ανώτατου επιπέδου ή διακεκομμένους χώρους ονομάτων - για εξαίρεση από το πακέτο σας. Για παράδειγμα, για εξαίρεση foo.bip, απλά θα καθορίζατε['foo.bip'].

Ένας κοινός αποκλεισμός που μπορείτε να κάνετε είναι tkinter, η βιβλιοθήκη Python για τη δημιουργία απλών γραφικών διεπαφών χρήστη μεταξύ πλατφορμών. Από προεπιλογή,tkinter και όλα τα αρχεία υποστήριξης είναι γεμάτα με ένα έργο PyInstaller. Εάν δεν χρησιμοποιείτε tkinter στο έργο σας, μπορείτε να το αποκλείσετε προσθέτοντας «tkinter» στο αποκλείει λίστα. Παραλείποντας tkinter θα μειώσει το μέγεθος του πακέτου κατά περίπου 7 MB.

Ένας άλλος κοινός αποκλεισμός είναι οι δοκιμαστικές σουίτες. Εάν ένα πακέτο που εισάγει το πρόγραμμά σας έχει μια δοκιμαστική σουίτα, η δοκιμαστική σουίτα θα μπορούσε τελικά να συμπεριληφθεί στο πακέτο PyInstaller. Εάν δεν εκτελέσετε πραγματικά τη δοκιμαστική σουίτα στο αναπτυγμένο πρόγραμμα, μπορείτε να την εξαιρέσετε με ασφάλεια.

Λάβετε υπόψη ότι τα πακέτα που δημιουργούνται χρησιμοποιώντας εξαιρέσεις πρέπει να ελέγχονται διεξοδικά πριν από τη χρήση. Εάν καταλήξετε να αποκλείσετε τη λειτουργικότητα που χρησιμοποιείται σε κάποιο μελλοντικό σενάριο που δεν περιμένατε, η εφαρμογή σας θα διακοπεί.

Συμβουλές για το PyInstaller

  • Δημιουργήστε το πακέτο PyInstaller στο λειτουργικό σύστημα στο οποίο σκοπεύετε να αναπτύξετε. Το PyInstaller δεν υποστηρίζει εκδόσεις πλατφορμών. Εάν πρέπει να αναπτύξετε την αυτόνομη εφαρμογή Python σε συστήματα MacOS, Linux και Windows, τότε θα πρέπει να εγκαταστήσετε το PyInstaller και να δημιουργήσετε ξεχωριστές εκδόσεις της εφαρμογής σε καθένα από αυτά τα λειτουργικά συστήματα.
  • Δημιουργήστε το πακέτο PyInstaller καθώς αναπτύσσετε την εφαρμογή σας. Μόλις γνωρίζετε ότι θα αναπτύξετε το έργο σας με το PyInstaller, δημιουργήστε το δικό σας .spec αρχειοθετήστε και ξεκινήστε τη βελτίωση του πακέτου PyInstaller παράλληλα με την ανάπτυξη της εφαρμογής σας. Με αυτόν τον τρόπο μπορείτε να προσθέσετε εξαιρέσεις ή εγκλείσματα καθώς πηγαίνετε και να δοκιμάσετε τον τρόπο ανάπτυξης νέων λειτουργιών με την εφαρμογή καθώς τις γράφετε.
  • Μην χρησιμοποιείτε το PyInstaller's- ένα αρχείο τρόπος. Το PyInstaller περιλαμβάνει διακόπτη γραμμής εντολών, - ένα αρχείο, που συσκευάζει ολόκληρη την εφαρμογή σας σε ένα μόνο εκτελέσιμο πρόγραμμα αυτόματης εξαγωγής. Αυτό ακούγεται σαν μια υπέροχη ιδέα - πρέπει να παραδώσετε μόνο ένα αρχείο! - αλλά έχει κάποιες παγίδες. Κάθε φορά που εκτελείτε την εφαρμογή, πρέπει πρώτα να αποσυσκευάσετε όλα τα αρχεία εντός του εκτελέσιμου σε προσωρινό κατάλογο. Εάν η εφαρμογή είναι μεγάλη (για παράδειγμα 200MB), η αποσυσκευασία μπορεί να σημαίνει καθυστέρηση αρκετών δευτερολέπτων. Χρησιμοποιήστε την προεπιλεγμένη λειτουργία ενός καταλόγου και απλώς συσκευάστε τα όλα ως .φερμουάρ αρχείο.
  • Δημιουργήστε ένα πρόγραμμα εγκατάστασης για την εφαρμογή PyInstaller. Εάν θέλετε κάποιον τρόπο να αναπτύξετε την εφαρμογή σας εκτός από ένα αρχείο .zip, εξετάστε το ενδεχόμενο να χρησιμοποιήσετε ένα βοηθητικό πρόγραμμα εγκατάστασης όπως το ανοιχτό λογισμικό Nullsoft Scriptable Install System. Προσθέτει ελάχιστη επιβάρυνση στο μέγεθος του παραδοτέου και σας επιτρέπει να διαμορφώσετε πολλές πτυχές της διαδικασίας εγκατάστασης, όπως τη δημιουργία συντομεύσεων στο εκτελέσιμο.
  • Μην περιμένετε επιταχύνσεις. Το PyInstaller είναι ένασυσκευασία σύστημα, όχι έναμεταγλωττιστήςή έναβελτιστοποιητής. Ο κώδικας που είναι συσκευασμένος με το PyInstaller δεν εκτελείται γρηγορότερα από ότι θα εκτελούσε στο αρχικό σύστημα. Εάν θέλετε να επιταχύνετε τον κώδικα Python, χρησιμοποιήστε μια βιβλιοθήκη επιτάχυνσης C που είναι κατάλληλη για την εργασία ή ένα έργο όπως το Cython.

Πώς να κάνετε περισσότερα με την Python

  • Εκμάθηση Cython: Πώς να επιταχύνετε το Python
  • Πώς να εγκαταστήσετε το Python με τον έξυπνο τρόπο
  • Καλύτερη διαχείριση έργου Python με την Ποίηση
  • Virtualenv και venv: Εξηγήθηκαν εικονικά περιβάλλοντα Python
  • Το Python virtualenv και το venv κάνουν και δεν πρέπει
  • Η εξήγηση και οι υποεπεξεργασίες Python εξηγούνται
  • Πώς να χρησιμοποιήσετε το πρόγραμμα εντοπισμού σφαλμάτων Python
  • Πώς να χρησιμοποιήσετε το χρονοδιάγραμμα για τον προφίλ κώδικα Python
  • Πώς να χρησιμοποιήσετε το cProfile για να προβάλετε τον κώδικα Python
  • Ξεκινήστε με το async στο Python
  • Πώς να χρησιμοποιήσετε το asyncio στο Python
  • Πώς να μετατρέψετε το Python σε JavaScript (και να επιστρέψετε ξανά)