我正在寻找一种在 Python 2.x 中使用 importlib 来即时重写导入模块的字节码的方法。换句话说,我需要在导入期间在编译和执行步骤之间 Hook 我自己的函数。除此之外,我希望导入功能与内置功能一样工作。

我已经使用 imputil 做到了这一点,但是该库并未涵盖所有情况,并且无论如何都已弃用。

最佳答案

看过 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

关于python - 如何使用 importlib 重写字节码?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3769336/

10-13 09:51