Python: 将Python包以程序化方式编译为pyc或pyo文件

7

这是我的测试套件。

我在一个临时文件夹中有一个自动生成的Python包。它全部都是.py文件。我想以编程方式将它们编译成(a).pyc和(b).pyo文件。(一个测试将进行.pyc,另一个将进行.pyo。)当然,这应该使用活动解释器完成。我不想导入模块,只想编译。

我该怎么做?

4个回答

10

在您的Python库目录中,将会有一个名为compileall.py的脚本 (例如,/usr/lib/python2.6/compileall.py)。

在您的代码中,通过生成的代码所在的目录,使用os.spawnl(例如)生成对compileall.py的调用。如果您使用python -O来调用它,它将会生成.pyo文件;如果您使用python来调用它,它将会生成.pyc文件。

我猜想,关键在于使用正确版本的Python解释器进行调用。

compileall.py在内部使用py_compile


6
请注意,调用compileall模块的正确方式是使用python -m compileall,而不是python /path/to/compileall.py。要找出Python解释器的位置,请使用sys.executable - intgr

2

您可能想查看py_compile模块。不幸的是,它不能让您在pyopyc之间进行选择。


4
-O参数可以让python运行更快。 - Ignacio Vazquez-Abrams
1
是的,如果可以为每个测试配置启动一个单独参数化的Python解释器,这将不会成为问题。 - Alexander Gessler

1
请注意,只要在导入 Python 模块(*.py)的目录中有写入权限,就会创建与其同名的 *.pyc 文件。 此外,*.pyc 和 *.pyo 不会 增加程序性能,除了减少模块加载时间。

0

使用py_compile可以选择在.pyo和.pyc之间进行选择

import py_compile

编译为简单的字节码:

py_compile.compile('sourcefilename.py', 'destinationfilename.pyc', doraise=True )

编译为优化的字节码:可以传递'-o'和'-oo'作为参数

py_compile.compile('sourcefilename.py', 'destinationfilename.pyo','-oo', doraise=True )

我已经尝试过Python 2.7,似乎只有在传递所有参数时才能正常工作。


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