ฉันต้องการเสนอเวอร์ชันของฉันซึ่งเป็นการผสมผสานระหว่างโซลูชันของ Boaz Yaniv และ Omnifarious มันจะนำเข้าเวอร์ชันระบบของโมดูลโดยมีข้อแตกต่างหลักสองประการจากคำตอบก่อนหน้านี้:
- รองรับสัญกรณ์ 'dot' เช่น package.module
- เป็นการแทนที่แบบดรอปอินสำหรับคำสั่งนำเข้าในโมดูลระบบซึ่งหมายความว่าคุณต้องแทนที่บรรทัดนั้นหนึ่งบรรทัดและหากมีการเรียกไปยังโมดูลอยู่แล้วก็จะทำงานได้ตามที่เป็นอยู่
วางสิ่งนี้ไว้ในที่ที่สามารถเข้าถึงได้เพื่อให้คุณสามารถเรียกใช้ได้ (ฉันมีของฉันอยู่ในไฟล์ __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
ตัวอย่าง
ฉันต้องการนำเข้า mysql.connection แต่ฉันมีแพ็คเกจท้องถิ่นที่เรียกว่า mysql (ยูทิลิตี้ mysql อย่างเป็นทางการ) ดังนั้นเพื่อรับตัวเชื่อมต่อจากแพ็คเกจ mysql ของระบบฉันจึงแทนที่สิ่งนี้:
import mysql.connector
ด้วยสิ่งนี้:
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__])
ผลลัพธ์
# 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)