1

我正在研究MacroPy,该项目所做的一件事是通过 PEP302 导入挂钩连接到 Python 导入系统。但是,我没有做过(并且想做)的一件事是让 MacroPy 将导入的代码保存到.pyc文件中,就像正常导入一样,如果时间戳匹配,则.pyc优先使用文件而不是文件。.py

目前,我的代码如下所示:

def export_transformed(self, code, tree, module_name, file_name):
    f = open(file_name + suffix , 'wb')
    f.write('\0\0\0\0')
    timestamp = long(os.fstat(f.fileno()).st_mtime)
    wr_long(f, timestamp)
    marshal.dump(code, f)
    f.flush()
    f.seek(0, 0)
    f.write(imp.get_magic())

def find(self, file, pathname, description, module_name, package_path):

    try:
        f = open(file.name + suffix, 'rb')
        x = imp.load_compiled(module_name, pathname + suffix, f)
        return x
    except Exception, e:
        print e

这基本上是从py_compile模块复制和粘贴的,并修改为使用内存文件而不是磁盘。

我不喜欢这种复制和粘贴,因为它很脆弱:例如,它不能sys.dont_write_bytecode与 python3's 一起使用pycache。我可以手动修复这些以模拟行为,但我真正想要的是一种手动调用函数的方法:

try_load_pyc(name, timestamp)
save_pyc(name, code)

并将该挂钩连接到正常的.pyc保存/加载工作流程(它已经尊重所有与 pyc 相关的切换、环境变量等),而不是自己重新实现所有行为,而不是自己繁琐地重新实现所有行为。

我已经用谷歌搜索并没有想出太多。Python 2.7 和 Python 3.4 中是否公开了此类功能,或者是否有第三方模块可以为我执行此操作?

4

0 回答 0