Єдиний спосіб вирішити цю проблему - самостійно викрасти внутрішню імпортну техніку. Це непросто і загрожує небезпекою. Вам слід за будь-яку ціну уникати маяка у формі грааля, оскільки небезпека занадто небезпечна.
Перейменуйте замість цього модуль.
Якщо ви хочете дізнатися, як викрасти внутрішні імпортні машини, ось де ви б хотіли дізнатися, як це зробити:
Іноді є вагомі причини, щоб потрапити в цю небезпеку. Причину, яку ви даєте, немає серед них. Перейменуйте свій модуль.
Якщо ви скористаєтеся небезпечним шляхом, вам доведеться зіткнутися з однією проблемою, що коли ви завантажуєте модуль, він закінчується "офіційним ім'ям", щоб Python міг уникнути необхідності аналізувати вміст цього модуля ще раз. Зображення "офіційного імені" модуля до самого об'єкта модуля можна знайти в sys.modules
.
Це означає, що якщо ви import calendar
в одному місці, будь-який модуль імпортований буде вважатися модулем з офіційною назвою calendar
і всі інші спроби в import calendar
будь-якому іншому місці, в тому числі в іншому коді, який є частиною основної бібліотеки Python, отримають цей календар.
Можливо, можна створити імпортера-клієнта за допомогою модуля imputil в Python 2.x, який змусив модулі, завантажені з певних шляхів, шукати модулі, які вони імпортували, у щось інше, ніж sys.modules
перше чи щось подібне. Але це надзвичайно волохата річ, і вона все одно не працюватиме в Python 3.x.
Ви можете зробити надзвичайно потворну та жахливу річ, яка не передбачає підключення механізму імпорту. Це те, що ви, мабуть, не повинні робити, але це, ймовірно, спрацює. Він перетворює ваш calendar
модуль в гібрид модуля системного календаря і вашого модуля календаря. Дякую Боазу Яніву за скелет функції, яку я використовую . Помістіть це на початку вашого calendar.py
файлу:
import sys
def copy_in_standard_module_symbols(name, local_module):
import imp
for i in range(0, 100):
random_name = 'random_name_%d' % (i,)
if random_name not in sys.modules:
break
else:
random_name = None
if random_name is None:
raise RuntimeError("Couldn't manufacture an unused module name.")
f, pathname, desc = imp.find_module(name, sys.path[1:])
module = imp.load_module(random_name, f, pathname, desc)
f.close()
del sys.modules[random_name]
for key in module.__dict__:
if not hasattr(local_module, key):
setattr(local_module, key, getattr(module, key))
copy_in_standard_module_symbols('calendar', sys.modules[copy_in_standard_module_symbols.__module__])