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:
- Prend en charge la notation «point», par exemple. package.module
- Est un remplacement instantané de l'instruction d'importation sur les modules système, ce qui signifie qu'il vous suffit de remplacer cette ligne et s'il y a déjà des appels vers le module, ils fonctionneront tels quels
Mettez ceci quelque part accessible afin que vous puissiez l'appeler (j'ai le mien dans mon fichier __init__.py):
class SysModule(object):
pass
def import_non_local(name, local_module=None, path=None, full_name=None, accessor=SysModule()):
import imp, sys, os
path = path or sys.path[1:]
if isinstance(path, basestring):
path = [path]
if '.' in name:
package_name = name.split('.')[0]
f, pathname, desc = imp.find_module(package_name, path)
if pathname not in __path__:
__path__.insert(0, pathname)
imp.load_module(package_name, f, pathname, desc)
v = import_non_local('.'.join(name.split('.')[1:]), None, pathname, name, SysModule())
setattr(accessor, package_name, v)
if local_module:
for key in accessor.__dict__.keys():
setattr(local_module, key, getattr(accessor, key))
return accessor
try:
f, pathname, desc = imp.find_module(name, path)
if pathname not in __path__:
__path__.insert(0, pathname)
module = imp.load_module(name, f, pathname, desc)
setattr(accessor, name, module)
if local_module:
for key in accessor.__dict__.keys():
setattr(local_module, key, getattr(accessor, key))
return module
return accessor
finally:
try:
if f:
f.close()
except:
pass
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:
import mysql.connector
Avec ça:
import sys
from mysql.utilities import import_non_local # where I put the above function (mysql/utilities/__init__.py)
import_non_local('mysql.connector', sys.modules[__name__])
Résultat
# This unmodified line further down in the file now works just fine because mysql.connector has actually become part of the namespace
self.db_conn = mysql.connector.connect(**parameters)