【问题标题】:Loading zipped python module from database从数据库加载压缩的 python 模块
【发布时间】:2012-10-19 04:15:25
【问题描述】:

我有一个结构如下的 Python 模块:

demo/
├── __init__.py
├── app.py
├── models.py
├── modules.py

现在我想压缩这个模块并将其存储到数据库中。

如何加载这样的结构化包? 虽然我加载单个.py 文件并使用它的功能没有问题,但我不知道如何处理一个包。在这种情况下,app.pymodels.pymodules.py 导入。

当使用这种方法时,它首先加载 app.py 并抛出异常,因为它没有加载其他 2 个文件。

import new
code = <the code from the db>
mod = new.module('foo')
exec code in mod.__dict__
sys.modules['foo'] = mod

这是如何正确完成的?

【问题讨论】:

  • 你真的有一个 ZIP 文件吗?你可能想看看docs.python.org/2/library/zipimport.html#module-zipimport
  • 是的,但它来自数据库,因此没有与之关联的路径。
  • 从数据库中检索文件,以某种方式存储它,然后将位置添加到sys.path 并导入它?
  • @JonClements 可以,但我的文件系统是只读的。
  • 猜猜你必须编写自己的导入处理程序......我能想到的唯一其他选择是如果你创建了一个可以使用的小型 ramfs......

标签: python module python-2.7


【解决方案1】:

我相信您正在寻找的是创建查找器和加载器类,Doug Hellmann 在其中一篇 PyMOTW 帖子中进行了描述:

http://www.doughellmann.com/PyMOTW/sys/imports.html

虽然可能需要阅读 Doug 的完整帖子,但从数据库存储和加载多文件模块的示例的核心内容在使用 Python 数据库“搁置”的部分:

http://www.doughellmann.com/PyMOTW/sys/imports.html#importing-from-a-shelve

【讨论】:

  • 这不是很有帮助,你能提供更多细节吗?
  • 这不是一件小事。 Doug 的帖子很长,但是如果你通读它,你会看到 Doug 展示了如何在数据库中存储一组模块文件——特别是内置的“搁置”数据库,然后从数据库中加载模块稍后。
  • 虽然这不遵循 SO 指南,因为它只是链接其他信息,但它解释了原因(这很复杂)。所以+1。如果doughellman 错过了DNS 注册付款,那将是一个问题。
  • 它已经发生了,PyMOTW 现在已经为 python3 重做。旧链接现在是pymotw.com/2/sys/imports.html
猜你喜欢
  • 1970-01-01
  • 2017-11-16
  • 1970-01-01
  • 1970-01-01
  • 2015-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多