Boaz Yaniv와 Omnifarious의 솔루션이 결합 된 버전을 제공하고 싶습니다. 이전 답변과 두 가지 주요 차이점이있는 모듈의 시스템 버전을 가져옵니다.
- '점'표기법을 지원합니다. package.module
- 시스템 모듈의 import 문에 대한 드롭 인 대체입니다. 즉, 해당 한 줄만 바꾸면되고 이미 모듈에 대한 호출이있는 경우 그대로 작동합니다.
이것을 액세스 할 수있는 곳에 두어 호출 할 수 있습니다 (내 __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)