python - 动态组装 Python 模块,动态导入

标签 python python-3.x hook python-import

我正在尝试让自己熟悉 importlib Hook 。我想实现直接导入用其他语言编写的非 Pythonic 文件并维护源映射的功能,因此使用行号引发 SyntaxError 仍会提供有意义的堆栈跟踪。

我加载外部文件的方法是组装 Pythonic 源代码,然后编译它并在所需的上下文中执行它。

我在文档中读到实现 importlib.abc.SourceLoader 似乎是我的选择 — 然而,唯一被调用的方法是 exec_module。在那个阶段,据我所知,模块对象已经完全准备好了。那么为什么没有调用get_sourceget_dataget_code等呢?

我的 stub 实现:

import sys
import os

import importlib.abc
import importlib.machinery

class MyFinder(importlib.abc.MetaPathFinder):
    def __init__(self):
        pass

    def find_spec(self, fullname, path, target=None):
        print('find_spec', fullname, path, target)

        # filename = '{}.npy'.format(fullname)
        # if not os.path.exists(filename):
        #     return

        if fullname != 'foobar':
            return

        filename = 'foobar://ponyworld/foo.py'

        spec = importlib.machinery.ModuleSpec(
            name = fullname,
            loader = MyLoader(fullname, path, target),
            origin = filename,
            loader_state = 1234,
            is_package = False,
        )

        return spec

class MyLoader(importlib.abc.SourceLoader):
    def __init__(self, fullname, path, target):
        pass

    def get_data(self, path):
        print('get_data', path)

    def get_filename(self, fullname):
        print('get_filename', fullname)

    def path_stats(self, path):
        print('path_stats', path)

    def set_data(self, path, data):
        print('set_data', path, data)

    def get_code(self, fullname):
        print('get_code', fullname)

    def exec_module(self, module):
        print('exec_module', module)
        print(dir(module))

    def get_source(self, fullname):
        print('get_source', fullname)

    def is_package(self, fullname):
        print('is_package', fullname)

sys.meta_path.append(MyFinder())

# import fake module to see if it works
import foobar

最佳答案

我误解了文档并忽略了 importlib.abc.SourceLoader 已经提供了 get_codeexec_moduleload_module 的实现>、get_sourceis_package。只有在需要时才会覆盖这些,并且只有 get_dataget_filename 是必需的最小值。

关于python - 动态组装 Python 模块,动态导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29584902/

相关文章:

python - 如何将列表与数据框的列进行比较,并在数据框列和列表之间的元素匹配时从列表中删除元素?

c++ - 暂停低级 Hook 的最佳方法(winapi)

SVN 提交后 Hook 未执行文件

python - unittest - 对输入和输出列表运行相同的测试

python - 在 Linux 中使用 Python 绘制随机点

Python 正则表达式 : Get only one expression to match

c - 如何 Hook __usercall、__userpurge (__spoils) 函数?

python - django 托管错误,关于alwaysdata.com

python - 无法将 Python 文件作为 .exe 文件运行,出现错误 'ModuleNotFoundError: No module named ' pandas' '

python - 无法弄清楚如何在Python3中重复过程