Je travaille sur une documentation (personnelle) pour la bibliothèque imbriquée matplotlib (MPL), qui diffère de celle fournie par MPL, par les paquets de sous-modules intéressés. J'écris un script Python qui, j'espère, automatisera la génération de documents à partir des futures versions de MPL.
J'ai sélectionné les sous-modules / packages intéressés et je veux lister leurs classes principales à partir desquelles je vais générer la liste et la traiter avecpydoc
Le problème est que je ne trouve pas de moyen de demander à Python de charger un sous-module à partir d'une chaîne. Voici un exemple de ce que j'ai essayé:
import matplotlib.text as text
x = dir(text)
.
i = __import__('matplotlib.text')
y = dir(i)
.
j = __import__('matplotlib')
z = dir(j)
Et voici une comparaison à 3 voies des listes ci-dessus via pprint:
Je ne comprends pas ce qui est chargé dans l' y
objet - c'est la base matplotlib
plus quelque chose d'autre, mais il manque les informations que je voulais et ce sont les classes principales du matplotlib.text
package. C'est la partie supérieure de couleur bleue sur la capture d'écran ( x
liste)
Veuillez ne pas suggérer Sphinx comme approche différente.
la source
__import__(str)
plutôt que leimport
statemetn standard ?import
instruction. Voici un exemple d'utilisation: djangosnippets.org/snippets/3048Réponses:
La
__import__
fonction peut être un peu difficile à comprendre.Si vous changez
à
alors
i
fera référence àmatplotlib.text
.Dans Python 2.7 et Python 3.1 ou version ultérieure, vous pouvez utiliser
importlib
:Quelques notes
Si vous essayez d'importer quelque chose à partir d'un sous-dossier, par exemple
./feature/email.py
, le code ressemblera àimportlib.import_module("feature.email")
Vous ne pouvez rien importer s'il n'y en a pas
__init__.py
dans le dossier contenant le fichier que vous essayez d'importerla source
importlib
devrait être disponible sur pypi pour <python2.7./feature/email.py
) le code ressemblera àimportlib.import_module("feature.email")
__init__.py
dans le dossier contenant le fichier que vous essayez d'importer.import moduleName
où moduleName est une chaîne. Et pourquoi pasfrom moduleName import *
?importlib.import_module
est ce que vous recherchez. Il renvoie le module importé. (Uniquement disponible pour Python> = 2.7 ou 3.x):Vous pouvez ensuite accéder à tout ce qui se trouve dans le module comme
mymodule.myclass
, etc.la source
imp.load_source(..)
utiliser leimp
module comme suggéré dans cette réponse stackoverflow.com/questions/67631/…import moduleName
où moduleName est une chaîne. Et pourquoi pasfrom moduleName import *
?a passé du temps à essayer d'importer des modules à partir d'une liste, et c'est le fil de discussion qui m'a guidé la plupart du temps - mais je n'ai pas compris l'utilisation de ___import____ -
alors voici comment importer un module à partir d'une chaîne et obtenir le même comportement que l'importation. Et essayez / sauf le cas d'erreur aussi. :)
et oui, pour python 2.7> vous avez d'autres options - mais pour 2.6 <, cela fonctionne.
la source
J'ai développé ces 3 fonctions utiles:
Et chaque fois que je veux recharger une nouvelle instance, je dois juste appeler getInstance () comme ceci:
Enfin, je peux appeler toutes les fonctions de la nouvelle instance:
La seule spécificité ici est de personnaliser la liste des paramètres (param1, param2, param3) de votre instance.
la source
En plus d'utiliser,
importlib
on peut également utiliserexec
méthode pour importer un module à partir d'une variable chaîne.Ici, je montre un exemple d'importation de la
combinations
méthode à partir duitertools
package en utilisant laexec
méthode:Production:
la source