【发布时间】:2018-04-08 17:03:21
【问题描述】:
我阅读了一个教程,您可以将所有 libs 文件编译为 .pyc,然后将所有 .pyc 打包为压缩文件。然后蟒蛇仍然像魔术一样工作,它变得明显更小。 但是当我将所有 .pyc 文件压缩为 python36.zip 并将它们保存在 /lib/python3.6 下时。尝试启动python,python说找不到模块编解码器。
我做错了什么?有人能解释一下这真的有用吗?
【问题讨论】:
标签: python
我阅读了一个教程,您可以将所有 libs 文件编译为 .pyc,然后将所有 .pyc 打包为压缩文件。然后蟒蛇仍然像魔术一样工作,它变得明显更小。 但是当我将所有 .pyc 文件压缩为 python36.zip 并将它们保存在 /lib/python3.6 下时。尝试启动python,python说找不到模块编解码器。
我做错了什么?有人能解释一下这真的有用吗?
【问题讨论】:
标签: python
要从.zip 文件中导入模块,you need to add that file to sys.path - 然后它将充当搜索目录。完成这项工作的 zipimport 模块是一个内置模块。
sys.path 是这样构造的:
PYTHONPATH environment variable + value calculated 来自编译的默认值(pyconfig.h 中的PYTHONPATH 宏)
site被导入that does the following:
site-packagessite-packages directories under sys.prefix and sys.exec_prefix。
sys 属性时,解释器does a number of tests 包括寻找os.py 文件和lib-dynload 目录,它们通常应该在哪里site-packages 目录中的.pth 文件并将它们的行附加到sys.path,将它们视为相对于文件位置的路径。因此,您可以将所有标准模块移动到预定义的.zip 文件中。但是你可能需要留下一个os.py 或lib-dynload 如果sys.prefix 和sys.exec_prefix 之后变成空白(内容无关,移动的模块将从.zip 导入,因为它更早于sys.path ),否则您将无法访问所有第 3 方模块。
在sys.path 中有自己的条目的子目录需要单独处理,以便它们的内容仍然可以在sys.path 上找到。
(在 Python 2.7-win32 中测试)
虽然将.pyc 文件添加到存档中就足够了,但pdb 和堆栈跟踪将毫无用处,除非您也将.pys 放在那里。
【讨论】:
libpythonX.Y.so,因为它是 Python 引擎。 .so files that are Python extension modules, you should be able to。请注意,它们仍然可以在 sys.path 上以相同的模块名称找到。目录条目本身在sys.exec_prefix 搜索中进行了测试(更新了答案),因此您可能需要保留它。