Situation: - Il y a un module dans mon project_folder appelé calendrier - Je voudrais utiliser la classe Calendar intégrée des bibliothèques Python - Lorsque j'utilise à partir de Calendar Import Calendar, il se plaint parce qu'il essaie de se charger à partir de mon module.
J'ai fait quelques recherches et je n'arrive pas à trouver une solution à mon problème.
- Comment accéder à un module de bibliothèque standard en Python quand il y a un module local avec le même nom?
- http://docs.python.org/whatsnew/2.5.html
- Comment éviter d'écrire tout le temps le nom du module lors de l'importation d'un module en python?
Des idées sans avoir à renommer mon module?
Réponses:
La solution acceptée contient une approche désormais obsolète.
La documentation importlib donne ici un bon exemple de la manière la plus appropriée de charger un module directement à partir d'un chemin de fichier pour python> = 3.5:
Ainsi, vous pouvez charger n'importe quel fichier .py à partir d'un chemin et définir le nom du module comme vous le souhaitez. Donc, ajustez simplement le
module_name
pour qu'il soit le nom personnalisé que vous souhaitez que le module ait lors de l'importation.Pour charger un package au lieu d'un seul fichier,
file_path
devrait être le chemin vers la racine du package__init__.py
la source
file_path=r"C:\Users\My User\My Path\Module File.py"
. Ensuite, j'ai appelémodule_name
comme le module publié pour avoir un script de travail complet qui, enlevé cet extrait, pourrait être utilisé sur d'autresIl n'est pas nécessaire de changer le nom de votre module. Vous pouvez plutôt utiliser l’importation_absolue pour modifier le comportement d’importation. Par exemple, avec stem / socket.py, j'importe le module socket comme suit:
Cela ne fonctionne qu'avec Python 2.5 et supérieur; c'est un comportement d'activation qui est le comportement par défaut dans Python 3.0 et supérieur. Pylint se plaindra du code mais il est parfaitement valide.
la source
PYTHONPATH
. Une autre question montre comment résoudre cela.En fait, résoudre ce problème est assez facile, mais l'implémentation sera toujours un peu fragile, car cela dépend des composants internes du mécanisme d'importation python et ils sont susceptibles de changer dans les versions futures.
(le code suivant montre comment charger les modules locaux et non locaux et comment ils peuvent coexister)
La meilleure solution, si possible, est d'éviter de nommer vos modules avec le même nom que les noms de bibliothèque standard ou de module intégré.
la source
sys.modules
les tentatives ultérieures de chargement du module local?La seule façon de résoudre ce problème est de détourner vous-même la machinerie d'importation interne. Ce n’est pas facile et risqué. Vous devez éviter à tout prix la balise en forme de graal car le péril est trop périlleux.
Renommez plutôt votre module.
Si vous voulez apprendre à détourner la machinerie d'importation interne, voici où vous iriez pour savoir comment procéder:
Il y a parfois de bonnes raisons de courir ce péril. La raison que vous donnez n'est pas parmi eux. Renommez votre module.
Si vous prenez le chemin périlleux, un problème que vous rencontrerez est que lorsque vous chargez un module, il se retrouve avec un `` nom officiel '' afin que Python puisse éviter d'avoir à analyser à nouveau le contenu de ce module. Un mappage du «nom officiel» d'un module à l'objet module lui-même peut être trouvé dans
sys.modules
.Cela signifie que si vous êtes
import calendar
à un endroit, quel que soit le module importé, sera considéré comme le module avec le nom officielcalendar
et toutes les autres tentatives versimport calendar
n'importe où ailleurs, y compris dans un autre code faisant partie de la bibliothèque principale Python, obtiendront ce calendrier.Il serait peut-être possible de concevoir un importateur client en utilisant le module imputil de Python 2.x qui obligeait les modules chargés à partir de certains chemins à rechercher les modules qu'ils importaient dans autre chose que le
sys.modules
premier ou quelque chose du genre. Mais c'est une chose extrêmement épineuse à faire, et cela ne fonctionnera pas de toute façon dans Python 3.x.Il y a une chose extrêmement laide et horrible que vous pouvez faire qui n'implique pas d'accrochage au mécanisme d'importation. C'est quelque chose que vous ne devriez probablement pas faire, mais cela fonctionnera probablement. Il transforme votre
calendar
module en un hybride du module de calendrier système et de votre module de calendrier. Merci à Boaz Yaniv pour le squelette de la fonction que j'utilise . Mettez ceci au début de votrecalendar.py
fichier:la source
code
module std de Python ), ce qui signifie que seule une fraction des développeurs pourrait avoir des problèmes avec ce "hack de fusion". Les utilisateurs ne seraient pas du tout affectés.Je voudrais proposer ma version, qui est une combinaison de la solution de Boaz Yaniv et Omnifarious. Il importera la version système d'un module, avec deux différences principales par rapport aux réponses précédentes:
Mettez ceci quelque part accessible afin que vous puissiez l'appeler (j'ai le mien dans mon fichier __init__.py):
Exemple
Je voulais importer mysql.connection, mais j'avais déjà un paquet local appelé mysql (les utilitaires officiels de mysql). Donc, pour obtenir le connecteur du package mysql du système, j'ai remplacé ceci:
Avec ça:
Résultat
la source
Modifiez le chemin d'importation:
la source
sys.modules
, et il n'importera pas à nouveau un module avec le même nom.