Saya ingin menawarkan versi saya, yang merupakan kombinasi dari solusi Boaz Yaniv dan Omnifarious. Ini akan mengimpor versi sistem dari modul, dengan dua perbedaan utama dari jawaban sebelumnya:
- Mendukung notasi 'titik', mis. package.module
- Merupakan pengganti drop-in untuk pernyataan import pada modul sistem, yang berarti Anda hanya perlu mengganti satu baris itu dan jika sudah ada panggilan yang dilakukan ke modul, mereka akan bekerja sebagaimana adanya
Letakkan ini di suatu tempat yang dapat diakses sehingga Anda dapat memanggilnya (saya punya milik saya di file __init__.py saya):
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
Contoh
Saya ingin mengimpor mysql.connection, tetapi saya memiliki paket lokal yang sudah disebut mysql (utilitas resmi mysql). Jadi untuk mendapatkan konektor dari paket sistem mysql, saya mengganti ini:
import mysql.connector
Dengan ini:
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__])
Hasil
# 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)