是否可以替换python import命令?

时间:2015-05-07 04:18:17

标签: python

我有一个奇怪的要求。我无法在机器上(在工作场所)安装(或编译)python-fabric模块。我想知道是否有可能将整个结构的源代码复制为单个文件并粘贴到我的文件中(类似“sqlite amalgamation”)?这有用吗?

- >获取结构模块的来源。 - >将此模块的所有文件内容复制到文件(singlefile.py) - >现在在myfile.py上导入这个singlefile.py

有什么想法? (让我们假设,像工作场所一样,paramiko,pycrypto之类的依赖关系。)

1 个答案:

答案 0 :(得分:1)

如果库有任何C扩展名,那么肯定无法做到这一点。

如果没有,那么技术上是可能的,但实际上并非如此。

您几乎肯定想要做的是使用virtualenv,或者,如果您不能这样做,则使用用户站点包而不是系统站点包,或者其他一些方法来绕过“无法安装”问题,只需安装即可。

但如果你对技术部分感兴趣......

如果Fabric是一个.py文件,那就很容易了。但是看the source,它有很多文件。它们是按层次结构组织的,而不仅仅是一个平面目录。并且有一个非平凡的setup.py,这通常意味着它最终安装的方式与源树中的方式不同。

所以,要做到这一点,你需要做的是:

  • 在源代码树中安装“开发”。
  • 获取已安装的每个文件,并将其源包装在一个巨大的字符串中(首先反斜杠 - 转义任何三重引号);后跟一个函数compiles该字符串,exec在一个新的全局字典中,用types.ModuleType构建一个dict对象,然后将其插入sys.modules 1}}词典;然后调用该函数。
  • 按照文件导入的反向拓扑排序顺序连接包装文件。
  • 将结果嵌入文件顶部。

这里唯一真正棘手的,而不是乏味的,是:

  • 模块是第一类对象,类型包含普通构造函数和所有内容。
  • import spam在转向模块加载器之前始终会查找sys.modules['spam'],因此如果您预先填充,import将接受它

从理论上讲,这应该有效。或者接近它的东西;我可能错过了一个细节。在实践中,我真诚地怀疑你想要这样做。