আমি আমার সংস্করণটি দিতে চাই, এটি বোজ ইয়ানিভ এবং সর্বজনীন সমাধানের সংমিশ্রণ। এটি পূর্ববর্তী দুটি উত্তর থেকে দুটি প্রধান পার্থক্য সহ একটি মডিউলটির সিস্টেম সংস্করণ আমদানি করবে:
- 'ডট' স্বরলিপি সমর্থন করে, যেমন। 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
উদাহরণ
আমি মাইএসকিএলসিএনএকশনটি আমদানি করতে চেয়েছিলাম, তবে আমার কাছে ইতিমধ্যে মাইএসকিএল (অফিশিয়াল মাইএসকিএল ইউটিলিটিস) নামে একটি স্থানীয় প্যাকেজ ছিল। সুতরাং সিস্টেম মাইএসকিএল প্যাকেজ থেকে সংযোগকারীটি পেতে, আমি এটি প্রতিস্থাপন করেছি:
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)