329 votes

Chargement de tous les modules dans un dossier en Python

Quelqu'un pourrait me donner un bon moyen d’importer un répertoire complet des modules ?
J’ai une structure comme suit :

J’ai essayé juste convertissant en un paquet en ajoutant et faire mais il n’a pas fonctionné de la façon dont je l’avais espéré.

465voto

Anurag Uniyal Points 31931

Répertorier tous les python fichiers dans le dossier actuel et mettez-les dans le variable en``

150voto

stefanw Points 5951

Ajouter le Variable à contenant :

Voir aussi http://docs.python.org/tutorial/modules.html

69voto

Lennart Regebro Points 52510

Faire le répertoire Foo un paquet par l'ajout d'un __init__.py. Dans cette __init__.py ajouter:

import bar
import eggs
import spam

Puisque vous le voulez dynamique (qui peut ou peut ne pas être une bonne idée), la liste de toutes py-fichiers avec la liste des dir et de les importer avec quelque chose comme ceci:

import os
for module in os.listdir(os.path.dirname(__file__)):
    if module == '__init__.py' or module[-3:] != '.py':
        continue
    __import__(module[:-3], locals(), globals())
del module

Puis, à partir de votre code ce faire:

import Foo

Vous pouvez désormais accéder aux modules avec

Foo.bar
Foo.eggs
Foo.spam

etc. de Foo d'importation * n'est pas une bonne idée pour plusieurs raisons, y compris le nom des affrontements et qu'il est difficile d'analyser le code.

43voto

Luca Invernizzi Points 1890

Poursuivant sur la réponse de Mihail, je crois que la voie non-hackers (comme, pour ne pas traiter les chemins des fichiers directement) est la suivante :

  1. créer un vide du fichier sous
  2. Exécuter

Vous obtiendrez :

16voto

Niall Douglas Points 1950

Je suis fatigué de ce problème moi-même, j'ai donc écrit un paquet appelé automodinit pour le fixer. Vous pouvez l'obtenir à partir d' http://pypi.python.org/pypi/automodinit/. L'utilisation est comme ceci:

  1. Inclure le automodinit paquet dans votre setup.py les dépendances.
  2. Remplacer tous __init__.py les fichiers comme ceci:
 __tous__ = ["je vais obtenir réécrit"]
 # Ne pas modifier la ligne ci-dessus, ou cette ligne!
 importation automodinit
 automodinit.automodinit(__nom__, __file__, globals())
 del automodinit
 # Tout ce que vous voulez peut aller après ici, il ne sera pas modifié.

Ça y est! À partir de maintenant sur l'importation d'un module de jeu __tous__ une liste de .py[co] les fichiers dans le module et sera également importer chaque ces fichiers comme si vous aviez tapé:

pour x dans l' __tout__: import x

Par conséquent, l'effet de "de M import *" correspond exactement à "importer M".

automodinit est heureux de courir à partir de l'intérieur des archives ZIP et est donc ZIP coffre-fort.

Niall

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X