Проблема в том, что препроцессор просматривает файл, обрабатывает его, выводит во временный файл и выполняет exec() временный файл. С импортированными библиотеками нужно обращаться немного по-другому, поскольку они не выполняются, а загружаются и становятся доступными для вызывающего модуля.
Что мне нужно что можно сделать: прервать импорт (поскольку препроцессор запускается в середине импорта), загрузить постобработанный код как tempModule и заменить исходный импорт на tempModule, чтобы обмануть вызывающий скрипт импортом в полагая, что tempModule является оригинальный модуль.
Я искал везде и до сих пор, но не нашел решения.
Этот вопрос о переполнении стека самое близкое к ответу, который я когда-либо видел:
Переопределить пространство имен в Python
Вот что у меня есть.
Код: Выделить всё
# Remove the bytecode file created by the first import
os.remove(moduleName + '.pyc')
# Remove the first import
del sys.modules[moduleName]
# Import the postprocessed module
tmpModule = __import__(tmpModuleName)
# Set first module's reference to point to the preprocessed module
sys.modules[moduleName] = tmpModule
Самое странное, что это решение по-прежнему работает совершенно нормально, как если бы первый завершенный модуль загружался нормально; если вы не удалите последнюю строку, вы получите сообщение об ошибке «модуль не найден».
Надеюсь, кто-нибудь из Stack Overflow знает об импорте гораздо больше, чем я, потому что здесь есть меня поставили в тупик.
Примечание: я буду предлагать только решение или, если это невозможно в Python; лучшее и самое подробное объяснение того, почему это возможно.
Обновление: для всех, кому интересно, вот рабочий код.< /strong>
Код: Выделить всё
if imp.lock_held() is True:
del sys.modules[moduleName]
sys.modules[tmpModuleName] = __import__(tmpModuleName)
sys.modules[moduleName] = __import__(tmpModuleName)
Подробнее здесь: https://stackoverflow.com/questions/301 ... hon-import
Мобильная версия