我正在研究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 中是否公开了此类功能,或者是否有第三方模块可以为我执行此操作?