有没有办法从内存导入Python egg,而不是从磁盘?
假设我有一个二进制字符串,这个字符串里包含了一个Python的包(也叫“蛋”),而且它是压缩过的。有没有办法直接从内存中执行并“导入”这个包,而不需要把它写到硬盘上呢?
4 个回答
1
看看这个 imp
模块: http://docs.python.org/library/imp.html
你可能会在使用字节编译的模块或者动态生成的模块时找到一些解决办法。
另外,这个方法可能也会对你有帮助(不过可能需要调整一下):
http://code.activestate.com/recipes/82234-importing-a-dynamically-generated-module/
正如在后面评论中提到的,这个方法只适用于单个模块。
这个问题和之前有人问的一个问题类似: Python,如何将一段Python代码字符串作为模块导入
2
其实,egg文件就是一种特殊的压缩文件,类似于zip文件,所以我们用zipimport.zipimporter
这个工具来导入它们。不过,这个工具是用C语言写的,可能对初学者来说有点复杂。
我觉得你可以考虑以下几种方法:
- 重新写一个修改版的zipimporter,让它可以接受像
file
这样的对象,而不是只接受文件名。 - 用Python重新实现zipimporter,然后修改它,让它也能接受
file
这样的对象。 - 或者,你可以先把文件写到临时位置,然后导入这个临时文件,最后再把它删除。
最后一种方法可能是最简单的。
1
之前我看过一个叫 pypiserver 的东西,可能正是你需要的那种工具:
这是它的独立版本:https://raw.github.com/schmir/pypiserver/standalone/pypi-server-standalone.py
这个版本用到了一个叫 DictImporter 的东西和 zlib 库,里面有一些有趣的功能,也许你可以试试做类似的事情。