मैं अपने संस्करण की पेशकश करना चाहूंगा, जो बोअज़ यानिव और ओम्निफ़ारसियस के समाधान का एक संयोजन है। यह मॉड्यूल के सिस्टम संस्करण को आयात करेगा, जिसमें पिछले उत्तरों से दो मुख्य अंतर होंगे:
- 'डॉट' संकेतन का समर्थन करता है, उदाहरण के लिए। 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)