为了挤进我目前正在使用的嵌入式系统中可用的有限数量的文件系统存储,我希望消除任何可以合理删除而不会显着影响功能或性能的文件。 Python库中的* .py,*。pyo和* .pyc文件占用了相当大的空间,我想知道哪些选项对于小型嵌入式系统中的Python 2.6安装最合理:< / p>
答案 0 :(得分:13)
http://www.network-theory.co.uk/docs/pytut/CompiledPythonfiles.html
当使用-O标志调用Python解释器时,会生成优化代码并将其存储在“.pyo”文件中。优化器目前没有多大帮助;它只删除断言语句。
将两个-O标志传递给Python解释器(-OO)将导致字节码编译器执行优化,在某些极少数情况下可能会导致程序出现故障。目前只有 doc 字符串从字节码中删除,从而产生更紧凑的'.pyo'文件。
我给你的建议?
如果您不需要断言语句和__doc__字符串,请使用-OO仅编译 .pyo 文件。
否则,请仅使用 .pyc 。
修改强>
我注意到你只提到了Python库。如果您只需要部分功能,可以删除大部分python库。
我还建议您查看tinypy,它是大约64kb的Python子集。
答案 1 :(得分:3)
3号应该而且会起作用。您不需要.pyo或.py文件来使用已编译的python代码。
答案 2 :(得分:2)
我建议只保留.py文件。启动时间的差异并不是那么大,并且拥有源代码是一个优势,因为它将在不同的python版本下运行而没有任何问题。
从python 2.6开始,将sys.dont_write_bytecode设置为True将完全禁止编译.pyc和.pyo文件,因此如果您有2.6可用,则可能需要使用该选项。
答案 3 :(得分:1)
它最终归结为你真的只需要三个选项中的一个,但你最好的选择是使用.pys和.pyos或.pycs。
以下是我看到您的每个选项的方式:
就空间而言,我的(非常轶事)体验是.py文件压缩效果最佳,而.pycs和.pyos则将它们放在zipfile中。如果你计划压缩文件,.pyos在空间方面往往不会获得太多收益,因为文档字符串往往压缩得相当好,而断言只是不占用那么多空间。
答案 4 :(得分:1)
以下是我在日常工作中最小化主线Python 2.7的磁盘需求的方法:
1)从标准库中删除不需要的包。以下是保守名单:
bsddb/test ctypes/test distutils/tests email/test idlelib lib-tk
lib2to3 pydoc.py tabnanny.py test unittest
请注意,某些Python代码可能具有令人惊讶的依赖性;例如setuptools
需要unittest
才能运行。
2)预编译所有Python代码,使用-OO来剥离断言和文档字符串。
find -name '*.py' | python -OO -m py_compile -
请注意,默认情况下,Python不会查看.pyo
个文件;您还必须使用选项或环境变量在运行时明确要求优化。以下列方式之一运行脚本:
python -OO -m mylib.myscript
PYTHONOPTIMIZE=2 python -m mylib.myscript
3)删除.py
源代码文件(除非您需要将它们作为脚本运行)和.pyc
未经优化的文件。
find '(' -name '*.py' -or -name '*.pyc' ')' -and -not -executable -execdir rm '{}' ';'
4)压缩Python库文件。 Python可以从zip文件加载模块。 zip文件中的路径必须与包层次结构匹配;因此,在压缩之前,您应该将site-packages
和.egg
目录合并到主库目录中。 (或者您可以将多个zip文件添加到Python路径中。)
在Linux上,Python的默认路径已经包含/usr/lib/python27.zip
,所以只需将zip文件放在那里就可以了。
将os.pyo
保留为普通(非压缩)文件,因为Python将其视为完整性检查。如果将其移动到zip文件,您将在每次Python调用时收到警告(尽管一切仍然有效)。或者你可以在那里留下一个空的os.py
文件,并将真正的文件放在zip文件中。
最后的说明:
.pyo
文件应该是性能获胜,除非磁盘速度非常快且处理器/ RAM非常慢。无论哪种方式,Python都是从内存而不是磁盘格式执行的,因此它只影响加载时的性能。虽然剥离文档字符串可以节省相当多的内存。.pyo
个文件不包含assert
个语句。.pyo
文件保留了函数名称和行号,因此可调性不会降低:您仍然可以获得良好的回溯,您只需手动查找源代码中的行号,您必须执行此操作反正。