我能否将所有Python标准库压缩,并且Python仍然能够导入它?

3
我读了一个教程,它说你可以将所有的libs文件编译成.pyc格式,然后把所有的.pyc文件打包成一个zip文件。这样,Python仍然像魔法一样工作,并且体积显著变小。
但是当我把所有的.pyc文件打包成python36.zip并保存在/lib/python3.6下时,尝试启动Python,Python会报错无法找到codecs模块。
我错在哪里了?有人能解释一下吗?这样做实际上会起作用吗?

可能是Python egg是什么?的重复问题。 - musically_ut
1个回答

3
要从 .zip 文件中导入模块,您需要将该文件添加到 sys.path - 然后它将作为搜索目录。执行此任务的模块是内置的 zipimport 模块。

sys.path是这样构建的:


因此,您可以将所有标准模块移动到预定义的.zip文件中。但是,如果移动后sys.prefixsys.exec_prefix变为空(内容无关紧要,移动的模块将从.zip导入,因为它在sys.path上更靠前),则您可能需要保留os.pylib-dynload,否则您将失去对所有第三方模块的访问权限。
您需要单独处理具有其自己在sys.path中条目的子目录,以便仍然可以在sys.path上找到它们的内容。
(在Python 2.7-win32中进行了测试)
尽管将.pyc文件添加到存档中已经足够,但是除非您也放置.py文件,否则pdb和堆栈跟踪将无用。

我检查了sys.path变量,并将所有内容压缩为python36,它的运行非常顺畅。唯一需要保留的目录是lib-dyload,因为Python从这个文件夹调用动态库。看起来这是我无法压缩的唯一内容。 - J.R.
@J.R.,你不能压缩libpythonX.Y.so,因为它是Python引擎。.so文件是Python扩展模块,你应该可以。只要确保它们仍然可以在相同的模块名称下在sys.path中找到。尽管目录条目本身在sys.exec_prefix搜索中进行了测试(已更新答案),但你可能需要将其保留。 - ivan_pozdeev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接