Как использовать importlib для переписывания байт-кода? - PullRequest
3 голосов
/ 22 сентября 2010

Я ищу способ использования importlib в Python 2.x для перезаписи байт-кода импортируемых модулей на лету.Другими словами, мне нужно подключить свою собственную функцию между этапом компиляции и выполнения во время импорта.Кроме того, я хочу, чтобы функция импорта работала так же, как встроенная.

Я уже сделал это с imputil , но эта библиотека не охватывает все случаи и не рекомендуетсяв любом случае.

1 Ответ

2 голосов
/ 22 сентября 2010

Изучив исходный код importlib, я думаю, что вы можете создать подкласс PyLoader в модуле _bootstrap и переопределить get_code:

class PyLoader:
    ...

    def get_code(self, fullname):
    """Get a code object from source."""
    source_path = self.source_path(fullname)
    if source_path is None:
        message = "a source path must exist to load {0}".format(fullname)
        raise ImportError(message)
    source = self.get_data(source_path)
    # Convert to universal newlines.
    line_endings = b'\n'
    for index, c in enumerate(source):
        if c == ord(b'\n'):
            break
        elif c == ord(b'\r'):
            line_endings = b'\r'
            try:
                if source[index+1] == ord(b'\n'):
                    line_endings += b'\n'
            except IndexError:
                pass
            break
    if line_endings != b'\n':
        source = source.replace(line_endings, b'\n')

    # modified here
    code = compile(source, source_path, 'exec', dont_inherit=True)
    return rewrite_code(code)

Я полагаю, вы знаете, что выделаю, но от имени программистов везде я считаю, что должен сказать: тьфу = p

...