Maison >développement back-end >Tutoriel Python >Comment puis-je accéder aux fichiers statiques dans un package Python ?

Comment puis-je accéder aux fichiers statiques dans un package Python ?

DDD
DDDoriginal
2024-12-12 20:38:10712parcourir

How Can I Access Static Files Within a Python Package?

Lecture d'un fichier statique à partir d'un package Python

Situation

Imaginez que votre package Python contient des fichiers texte modèles auxquels vous souhaitez accéder depuis votre programme. Lors de la spécification du chemin d'accès à ces fichiers, il devient nécessaire de gérer la structure du package.

TLDR : utilisez importlib.resources (Python 3.9)

Si la compatibilité ascendante n'est pas un problème (c'est-à-dire que vous utilisez Python 3.9 ou supérieur), exploitez le module importlib.resources.

from importlib import resources as impresources
from . import templates

inp_file = impresources.files(templates) / 'temp_file'
with inp_file.open("rt") as f:
    template = f.read()

Méthode traditionnelle : utilisation pkg_resources de Setuptools

Pour les versions Python inférieures à 3.9, pensez à utiliser le module pkg_resources de setuptools distribution.

import pkg_resources

# Could be a dot-separated package/module name or a "Requirement"
resource_package = __name__
resource_path = '/'.join(('templates', 'temp_file'))  # Do not use os.path.join()
template = pkg_resources.resource_string(resource_package, resource_path)
# or for a file-like stream:
template = pkg_resources.resource_stream(resource_package, resource_path)

Étapes :

  1. Localisez vos modèles dans la hiérarchie des packages :

    <your-package>
      +--<module-asking-for-the-file>
      +--templates/
           +--temp_file
  2. Référencez le fichier modèle en utilisant l'une ou l'autre des méthodes :

    • Option 1 (importlib.resources):

      from . import templates
      
      inp_file = impresources.files(templates) / 'temp_file'
    • Option 2 (pkg_resources):

      resource_path = '/'.join(('templates', 'temp_file'))
      template = pkg_resources.resource_string(__name__, resource_path)

Conseils :

  • Pour fichiers à l'intérieur de votre module actuel, utilisez package comme argument du package dans importlib.resources.
  • Le importlib.resources.files La fonction renvoie un objet semblable à un chemin, qui permet un fichier temporaire basé sur un gestionnaire de contexte accès.
  • Incluez tous les fichiers statiques dans votre setup.py ou MANIFEST à des fins d'empaquetage.
  • Envisagez de définir zip_safe=True dans setup.py pour activer zipapp distribution.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn