Tôi muốn cung cấp phiên bản của mình, là sự kết hợp giữa giải pháp của Boaz Yaniv và Omnifarious. Nó sẽ nhập phiên bản hệ thống của một mô-đun, với hai điểm khác biệt chính so với các câu trả lời trước:
- Hỗ trợ ký hiệu 'dấu chấm', ví dụ. package.module
- Là một phần thay thế cho câu lệnh nhập trên mô-đun hệ thống, nghĩa là bạn chỉ cần thay thế một dòng đó và nếu đã có lệnh gọi đến mô-đun thì chúng sẽ hoạt động như hiện tại
Đặt cái này ở nơi nào đó có thể truy cập được để bạn có thể gọi nó (Tôi có cái của tôi trong tệp __init__.py của tôi):
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
Thí dụ
Tôi muốn nhập mysql.connection, nhưng tôi đã có một gói cục bộ có tên là mysql (tiện ích mysql chính thức). Vì vậy, để lấy trình kết nối từ gói mysql hệ thống, tôi đã thay thế cái này:
import mysql.connector
Với cái này:
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__])
Kết quả
# 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)