zipimport — Εισαγωγή ενοτήτων από αρχεία Zip

Πηγαίος κώδικας: Lib/zipimport.py


Αυτή η ενότητα προσθέτει τη δυνατότητα εισαγωγής Python modules (*.py, *.pyc) και πακέτα από αρχεία σε μορφή ZIP. Συνήθως δεν είναι απαραίτητο να χρησιμοποιείς το module zipimport αποκλειστικά · χρησιμοποιείται αυτόματα από the built-in import mechanism for sys.path items that είναι διαδρομές προς αρχεία ZIP.

Συνήθως, το sys.path είναι μια λίστα με ονόματα καταλόγων υπό μορφή συμβολοσειρών. Αυτή η ενότητα επιτρέπει επίσης ένα στοιχείο του sys.path να είναι μια συμβολοσειρά που ονομάζει ένα αρχείο ZIP. Το αρχείο ZIP μπορεί να περιέχει μια δομή υποκαταλόγων για την υποστήριξη εισαγωγών πακέτων, και μπορεί να καθοριστεί μια διαδρομή εντός του αρχείου ώστε να γίνεται εισαγωγή μόνο από έναν υποκατάλογο. Για παράδειγμα, η διαδρομή example.zip/lib/ θα εισήγαγε μόνο από τον υποκατάλογο lib/ εντός του αρχείου.

Σε αρχείο ZIP μπορεί να υπάρχουν οποιαδήποτε αρχεία, αλλά οι εισαγωγείς(importers) καλούνται μόνο για αρχεία .py και .pyc. Η εισαγωγή δυναμικών modules(.pyd, .so) μέσω ZIP δεν επιτρέπεται. Σημειώστε ότι αν ένα αρχείο περιέχει μόνο αρχεία .py, η Python δεν θα προσπαθήσει να τροποποιήσει το αρχείο προσθέτοντας το αντίστοιχο αρχείο .pyc, πράγμα που σημαίνει ότι αν ένα αρχείο ZIP δεν περιέχει αρχεία .pyc, η εισαγωγή μπορεί να είναι αρκετά αργή.

Άλλαξε στην έκδοση 3.13: Το ZIP64 υποστηρίζεται

Άλλαξε στην έκδοση 3.8: Παλαιότερα, τα αρχεία ZIP με σχόλιο αρχείου δεν υποστηρίζονταν.

Δείτε επίσης

PKZIP Application Note

Τεκμηρίωση σχετικά με τη μορφή αρχείου ZIP από τον Phil Katz, τον δημιουργό της μορφής και των αλγορίθμων που χρησιμοποιούνται.

PEP 273 - Εισαγωγή ενοτήτων από αρχεία Zip

Συντάχθηκε από τον James C. Ahlstrom, ο οποίος παρείχε επίσης μια υλοποίηση. Η Python 2.3 ακολουθεί τις προδιαγραφές του PEP 273, αλλά χρησιμοποιεί μια υλοποίηση που συντάχθηκε από τον Just van Rossum και η οποία χρησιμοποιεί τους μηχανισμούς εισαγωγής που περιγράφονται στο PEP 302.

importlib - Η υλοποίηση του μηχανισμού εισαγωγής

Πακέτο που παρέχει τα σχετικά πρωτόκολλα προς εφαρμογή από όλους τους importers.

Αυτή η ενότητα ορίζει μια εξαίρεση:

exception zipimport.ZipImportError

Εξαίρεση που προκαλείται από αντικείμενα του τύπου zipimporter. Πρόκειται για υποκατηγορία του ImportError, οπότε μπορεί να αντιμετωπιστεί επίσης και ως ImportError.

Αντικείμενα zipimporter

zipimporter είναι η κλάση για την εισαγωγή αρχείων ZIP.

class zipimport.zipimporter(archivepath)

Δημιουργήστε ένα νέο στιγμιότυπο του zipimporter. Το archivepath πρέπει να είναι μια διαδρομή προς ένα αρχείο ZIP ή προς μια συγκεκριμένη διαδρομή μέσα σε ένα αρχείο ZIP. Για παράδειγμα, αν το archivepath είναι foo/bar.zip/lib, θα αναζητηθούν ενότητες στον κατάλογο lib μέσα στο αρχείο ZIP foo/bar.zip (εφόσον υπάρχει).

Η ZipImportError γίνεται raise αν η archivepath δεν παραπέμπει σε ένα έγκυρο αρχείο ZIP.

Άλλαξε στην έκδοση 3.12: Οι μέθοδοι find_loader() και find_module(), οι οποίες είχαν καταργηθεί από την έκδοση 3.10, έχουν πλέον αφαιρεθεί. Χρησιμοποιήστε αντ” αυτού τη μέθοδο find_spec().

create_module(spec)

Υλοποίηση της importlib.abc.Loader.create_module(), η οποία επιστρέφει None για να ζητήσει ρητά την προεπιλεγμένη σημασιολογία.

Added in version 3.10.

exec_module(module)

Εφαρμογή της συνάρτησης importlib.abc.Loader.exec_module().

Added in version 3.10.

find_spec(fullname, target=None)

Μια υλοποίηση της μεθόδου importlib.abc.PathEntryFinder.find_spec().

Added in version 3.10.

get_code(fullname)

Επιστρέφει το αντικείμενο κώδικα για το καθορισμένο module. Κάνει raise την ZipImportError αν δεν ήταν δυνατή η εισαγωγή του module.

get_data(pathname)

Επιστρέφει τα δεδομένα που σχετίζονται με το pathname. Κάνει raise τη OSError αν το αρχείο δεν βρέθηκε.

Άλλαξε στην έκδοση 3.3: Η IOError που παλαιότερα γινόταν raise, αποτελεί πλέον ψευδώνυμο του OSError.

get_filename(fullname)

Επιστρέφει την τιμή στην οποία θα οριζόταν η μεταβλητή __file__ εάν είχε εισαχθεί το συγκεκριμένο module. Κάνει raise την ZipImportError εάν δεν ήταν δυνατή η εισαγωγή του module.

Added in version 3.1.

get_source(fullname)

Επιστρέφει τον πηγαίο κώδικα για το καθορισμένο module. Κάνει raise την ZipImportError αν το module δεν βρέθηκε, και επιστρέφει None αν το αρχείο περιέχει το module, αλλά δεν περιλαμβάνεται σε πηγαίο κώδικα.

is_package(fullname)

Επιστρέφει «True» αν το module που καθορίζεται από το fullname είναι ένα πακέτο. Κάνει raise την ZipImportError αν το module δεν βρέθηκε.

load_module(fullname)

Φόρτωση του module που καθορίζεται από το fullname. Το fullname πρέπει να είναι το πλήρως προσδιορισμένο (με τελείες) όνομα του module. Επιστρέφει το εισαγόμενο module σε περίπτωση επιτυχίας, ενώ σε περίπτωση αποτυχίας προκαλεί το σφάλμα ZipImportError.

Καταργήθηκε από την έκδοση 3.10, θα αφαιρεθεί στην έκδοση 3.15: Χρησιμοποιήστε αντ” αυτού τη συνάρτηση exec_module().

invalidate_caches()

Εκκαθάριση της εσωτερικής προσωρινής μνήμης που περιέχει πληροφορίες σχετικά με τα αρχεία που βρίσκονται στο αρχείο ZIP.

Added in version 3.10.

archive

Το όνομα του αρχείου ZIP που αντιστοιχεί στον importer, χωρίς τυχόν υποδιαδρομή.

prefix

Η υποδιαδρομή μέσα στο αρχείο ZIP όπου πραγματοποιείται η αναζήτηση των module. Πρόκειται για την κενή συμβολοσειρά για αντικείμενα τύπου zipimporter που παραπέμπουν στην αρχική ρίζα του αρχείου ZIP.

Τα χαρακτηριστικά archive και prefix, όταν συνδυάζονται με μια κάθετο, ισοδυναμούν με το αρχικό όρισμα archivepath που δόθηκε στον κατασκευαστή zipimporter.

Παραδείγματα

Ακολουθεί ένα παράδειγμα που εισάγει ένα module από ένα αρχείο ZIP — σημειώστε ότι το module zipimport δεν χρησιμοποιείται ρητά.

$ unzip -l example_archive.zip
Archive:  example_archive.zip
  Length     Date   Time    Name
 --------    ----   ----    ----
     8467  01-01-00 12:30   example.py
 --------                   -------
     8467                   1 file
>>> import sys
>>># Προσθήκη του αρχείου στην αρχή της διαδρομής αναζήτησης του module
>>> sys.path.insert(0, 'example_archive.zip')
>>> import example