这是我的测试套件。
我在一个临时文件夹中有一个自动生成的Python包。它全部都是.py
文件。我想以编程方式将它们编译成(a).pyc
和(b).pyo
文件。(一个测试将进行.pyc
,另一个将进行.pyo
。)当然,这应该使用活动解释器完成。我不想导入模块,只想编译。
我该怎么做?
这是我的测试套件。
我在一个临时文件夹中有一个自动生成的Python包。它全部都是.py
文件。我想以编程方式将它们编译成(a).pyc
和(b).pyo
文件。(一个测试将进行.pyc
,另一个将进行.pyo
。)当然,这应该使用活动解释器完成。我不想导入模块,只想编译。
我该怎么做?
在您的Python库目录中,将会有一个名为compileall.py
的脚本 (例如,/usr/lib/python2.6/compileall.py
)。
在您的代码中,通过生成的代码所在的目录,使用os.spawnl
(例如)生成对compileall.py
的调用。如果您使用python -O
来调用它,它将会生成.pyo
文件;如果您使用python
来调用它,它将会生成.pyc
文件。
我猜想,关键在于使用正确版本的Python解释器进行调用。
compileall.py
在内部使用py_compile
。
您可能想查看py_compile
模块。不幸的是,它不能让您在pyo
和pyc
之间进行选择。
-O
参数可以让python
运行更快。 - Ignacio Vazquez-Abrams使用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,似乎只有在传递所有参数时才能正常工作。
compileall
模块的正确方式是使用python -m compileall
,而不是python /path/to/compileall.py
。要找出Python解释器的位置,请使用sys.executable
。 - intgr