Как переопределить импорт Python?Python

Программы на Python
Ответить
Anonymous
 Как переопределить импорт Python?

Сообщение Anonymous »

Я работаю над pypreprocessor, который представляет собой препроцессор, который принимает директивы стиля C, и мне удалось заставить его работать как традиционный препроцессор (он самопотребляет и выполняет постобработанный код на лету), за исключением того, что это нарушает импорт библиотеки.

Проблема в том, что препроцессор просматривает файл, обрабатывает его, выводит во временный файл и выполняет 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
moduleName — это имя исходного модуля, а tmpModuleName — это имя файла кода постобработки.

Самое странное, что это решение по-прежнему работает совершенно нормально, как если бы первый завершенный модуль загружался нормально; если вы не удалите последнюю строку, вы получите сообщение об ошибке «модуль не найден».

Надеюсь, кто-нибудь из Stack Overflow знает об импорте гораздо больше, чем я, потому что здесь есть меня поставили в тупик.

Примечание: я буду предлагать только решение или, если это невозможно в Python; лучшее и самое подробное объяснение того, почему это возможно.

Обновление: для всех, кому интересно, вот рабочий код.< /strong>

Код: Выделить всё

if imp.lock_held() is True:
del sys.modules[moduleName]
sys.modules[tmpModuleName] = __import__(tmpModuleName)
sys.modules[moduleName] = __import__(tmpModuleName)
Часть «imp.lock_held» определяет, загружается ли модуль как библиотека. Следующие строки сделают все остальное.

Подробнее здесь: https://stackoverflow.com/questions/301 ... hon-import
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»