3 Stimmen

Wie man importlib zum Umschreiben von Bytecode verwendet?

Ich suche nach einer Möglichkeit, importlib in Python 2.x zu verwenden, um den Bytecode von importierten Modulen auf dem Flug neu zu schreiben. Mit anderen Worten, ich muss meine eigene Funktion zwischen dem Kompilierungs- und Ausführungsschritt während des Imports einhängen. Außerdem möchte ich, dass die Importfunktion genauso funktioniert wie die integrierte Funktion.

Das habe ich bereits mit imputil gemacht, aber diese Bibliothek deckt nicht alle Fälle ab und ist sowieso veraltet.

2voto

Katriel Punkte 115208

Beim Durchsehen des Quellcodes von importlib glaube ich, dass Sie PyLoader in dem Modul _bootstrap untergeordnen und get_code überschreiben könnten:

class PyLoader:
    ...

    def get_code(self, fullname):
    """Holen Sie ein Code-Objekt aus einer Quelle."""
    source_path = self.source_path(fullname)
    if source_path is None:
        message = "ein Quellpfad muss existieren, um {0} zu laden".format(fullname)
        raise ImportError(message)
    source = self.get_data(source_path)
    # In universelle Zeilenumbrüche umwandeln.
    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')

    # Hier geändert
    code = compile(source, source_path, 'exec', dont_inherit=True)
    return rewrite_code(code)

Ich gehe davon aus, dass Sie wissen, was Sie tun, aber im Namen aller Programmierer würde ich sagen: ugh =p

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X