Quelqu'un pourrait-il me fournir un bon moyen d'importer tout un répertoire de modules?
J'ai une structure comme celle-ci:
/Foo
bar.py
spam.py
eggs.py
J'ai essayé de le convertir en package en ajoutant __init__.py
et en faisant, from Foo import *
mais cela n'a pas fonctionné comme je l'espérais.
python
python-import
Evan Fosmark
la source
la source
Réponses:
Répertoriez tous les
.py
fichiers python ( ) dans le dossier actuel et placez-les comme__all__
variables dans__init__.py
la source
if not os.path.basename(f).startswith('_')
ou à tout le moinsif not f.endswith('__init__.py')
à la fin de la compréhension de la listeos.path.isfile(f)
estTrue
. Cela filtrerait les liens symboliques et les répertoires cassés commesomedir.py/
(coin-cas, je l'admets, mais quand même ...)from . import *
après le réglage__all__
si vous voulez être à sous - modules disponibles à l' aide.
(par exemple , commemodule.submodule1
,module.submodule2
, etc.).Ajoutez la
__all__
variable à__init__.py
contenant:Voir aussi http://docs.python.org/tutorial/modules.html
la source
os.listdir()
, certains filtrage, décapage d'.py
extension et__all__
.moduleName.varName
ref. stackoverflow.com/a/710603/248616Mise à jour en 2017: vous voudrez probablement l'utiliser à la
importlib
place.Faites du répertoire Foo un package en ajoutant un
__init__.py
. Dans cet__init__.py
ajout:Puisque vous le voulez dynamique (ce qui peut être une bonne idée ou non), listez tous les fichiers py avec list dir et importez-les avec quelque chose comme ceci:
Ensuite, à partir de votre code, procédez comme suit:
Vous pouvez maintenant accéder aux modules avec
etc.
from Foo import *
n'est pas une bonne idée pour plusieurs raisons, y compris les conflits de noms et rendant difficile l'analyse du code.la source
__import__
hackish, je pense qu'il vaudrait mieux ajouter les noms__all__
puis mettrefrom . import *
en bas du script__import__
n'est pas à usage général, il est utilisé parinterpreter
, utilisezimportlib.import_module()
plutôt.from . import eggs
etc.__init__.py
avant que Python puisse importer. Avec seulementimport eggs
je reçoisModuleNotFoundError: No module named 'eggs'
en essayant deimport Foo
dans lemain.py
dans le répertoire ci - dessus.S'étendant sur la réponse de Mihail, je crois que la méthode non piratée (comme dans, ne pas gérer directement les chemins de fichiers) est la suivante:
__init__.py
fichier vide sousFoo/
Tu auras:
la source
RuntimeWarning
messages peuvent également être évités en ne pas utiliser du tout full_package_name:importer.find_module(package_name).load_module(package_name)
.RuntimeWarning
erreurs peuvent également être évitées (d'une manière peut-être laide) en important le parent (AKA dirname). Une façon de le faire est -if dirname not in sys.modules: pkgutil.find_loader(dirname).load_module(dirname)
. Bien sûr, cela ne fonctionne que s'ildirname
s'agit d'un chemin relatif à un seul composant; pas de barres obliques. Personnellement, je préfère l'approche de @ Artfunkel d'utiliser à la place le package_name de base.Python, incluez tous les fichiers dans un répertoire:
Pour les débutants qui ne peuvent tout simplement pas se mettre au travail et qui ont besoin de tenir leurs mains.
Créez un dossier / home / el / foo et créez un fichier
main.py
sous / home / el / foo Mettez ce code là:Créer un répertoire
/home/el/foo/hellokitty
Faites un fichier
__init__.py
sous/home/el/foo/hellokitty
et mettez ce code dedans:Créez deux fichiers python:
spam.py
etham.py
sous/home/el/foo/hellokitty
Définissez une fonction dans spam.py:
Définissez une fonction dans ham.py:
Exécuter:
la source
import *
est considérée comme une mauvaise pratique de codage Python. Comment faites-vous cela sans cela?Je me suis fatigué de ce problème moi-même, j'ai donc écrit un paquet appelé automodinit pour le corriger. Vous pouvez l'obtenir sur http://pypi.python.org/pypi/automodinit/ .
L'utilisation est comme ceci:
automodinit
package dans vossetup.py
dépendances.C'est tout! Désormais, l'importation d'un module définira __all__ sur une liste de fichiers .py [co] dans le module et importera également chacun de ces fichiers comme si vous aviez tapé:
Par conséquent, l'effet de "from M import *" correspond exactement à "import M".
automodinit
est heureux de fonctionner à l'intérieur des archives ZIP et est donc protégé par ZIP.Niall
la source
Je sais que je mets à jour un article assez ancien, et j'ai essayé de l'utiliser
automodinit
, mais j'ai découvert que son processus de configuration était interrompu pour python3. Donc, basé sur la réponse de Luca, j'ai trouvé une réponse plus simple - qui pourrait ne pas fonctionner avec .zip - à ce problème, alors j'ai pensé que je devrais la partager ici:dans le
__init__.py
module à partir deyourpackage
:et dans un autre package ci
yourpackage
- dessous :Ensuite, tous les modules placés dans le package seront chargés, et si vous écrivez un nouveau module, il sera également importé automatiquement. Bien sûr, utiliser ce genre de choses avec précaution, avec de grands pouvoirs entraîne de grandes responsabilités.
la source
la source
J'ai également rencontré ce problème et c'était ma solution:
Cette fonction crée un fichier (dans le dossier fourni) nommé
__init__.py
, qui contient une__all__
variable qui contient tous les modules du dossier.Par exemple, j'ai un dossier nommé
Test
qui contient:Donc, dans le script, je veux que les modules soient importés, j'écrirai:
Cela importera tout de
Test
et le__init__.py
fichier dansTest
contiendra désormais:la source
Exemple d'Anurag avec quelques corrections:
la source
Réponse d'Anurag Uniyal avec suggestions d'améliorations!
la source
Voyez que votre
__init__.py
définit__all__
. Les modules - packages doc ditla source
C'est le meilleur moyen que j'ai trouvé jusqu'à présent:
la source
Utiliser
importlib
la seule chose que vous devez ajouter estla source
error: Type of __all__ must be "Sequence[str]", not "List[Module]"
. La définition__all__
n'est pas requise si cetteimport_module
approche basée est utilisée.Regardez le module pkgutil de la bibliothèque standard. Il vous permettra de faire exactement ce que vous voulez tant que vous avez un
__init__.py
fichier dans le répertoire. Le__init__.py
fichier peut être vide.la source
J'ai créé un module pour cela, qui ne s'appuie pas sur
__init__.py
(ou tout autre fichier auxiliaire) et me fait taper uniquement les deux lignes suivantes:N'hésitez pas à réutiliser ou à contribuer: http://gitlab.com/aurelien-lourot/importdir
la source
Importez -les simplement par importlib et ajoutez-les à
__all__
(l'add
action est facultative) dans recurse dans le__init__.py
package.la source
py
Quand ce
from . import *
n'est pas assez bon, c'est une amélioration par rapport à la réponse de ted . Plus précisément, l'utilisation de__all__
n'est pas nécessaire avec cette approche.Notez que cela
module_name not in globals()
vise à éviter de réimporter le module s'il est déjà importé, car cela peut risquer des importations cycliques.la source