如何在Python中生成字节码文件


所有Python程序都会在执行之前自动将你的源代码编译成编译代码,也称为字节码。

无论何时你第一次导入模块,或者你的源文件是新文件,或者你更新了文件,那么在编译文件时,会在与.py文件相同的目录下创建一个最近编译的文件.pyc文件(从Python 3开始,你可能会看到.pyc文件位于名为__pycache__的子目录中,而不是与你的.py文件相同的目录中)。这是一种节省时间的方法,因为它可以防止Python在下一次运行程序时跳过编译步骤。

如果你正在运行带有导入语句(另一个文件)的脚本,则不会创建.pyc文件。例如,如果你有一个脚本(file1.py)导入另一个文件(file2.py)。

创建PYC文件的 easiest 方法是导入它。假设你有一个名为MainP.py的模块,只需执行:

>>> import MainP
>>>

但是,如果你想为未导入的模块创建.pyc文件,则必须使用名为py_compile的模块集来编译所有模块以执行此任务。

py_compile模块可以手动编译任何模块。我们还可以使用py_compile.compile函数以交互方式使用py_compile模块。

>>> import py_compile
>>> py_compile.compile('test.py')
'__pycache__\test.cpython-36.pyc'
>>>

在Python shell中运行上述语句后,你可以在__pycache__文件夹(Python 3)中看到一个.pyc文件,否则会在与你的test.py文件相同的位置创建。

如果你想一次编译多个文件,可以使用py_compile.main()函数,如下所示:

>>> #Compiles several files at a time
>>> py_compile.main(['test1.py', 'test2.py', 'test_sample1.py', 'test_sample2.py'])
0

我们可以看到生成了四个不同的编译文件:

但是,如果你想编译文件夹内的所有文件,可以使用compileall.compile_dir()函数。

>>> # Compile all the .py file from a particular folder.
>>> import compileall
>>> compileall.compile_dir('gmplot')
Listing 'gmplot'...
Listing 'gmplot\.git'...
Listing 'gmplot\.git\hooks'...
Listing 'gmplot\.git\info'...
Listing 'gmplot\.git\logs'...
Listing 'gmplot\.git\logs\refs'...
Listing 'gmplot\.git\logs\refs\heads'...
Listing 'gmplot\.git\logs\refs\remotes'...
Listing 'gmplot\.git\logs\refs\remotes\origin'...
Listing 'gmplot\.git\objects'...
Listing 'gmplot\.git\objects\info'...
Listing 'gmplot\.git\objects\pack'...
Listing 'gmplot\.git\refs'...
Listing 'gmplot\.git\refs\heads'...
Listing 'gmplot\.git\refs\remotes'...
Listing 'gmplot\.git\refs\remotes\origin'...
Listing 'gmplot\.git\refs\tags'...
Compiling 'gmplot\__init__.py'...
Compiling 'gmplot\color_dicts.py'...
Listing 'gmplot\gmplot'...
Listing 'gmplot\gmplot\markers'...
Compiling 'gmplot\gmplot.py'...
Compiling 'gmplot\google_maps_templates.py'...
Compiling 'gmplot\setup.py'...
Listing 'gmplot\tests'...
True

现在我们看到.pyc文件已创建在“folder_name\__pycache__”位置。

如果你想编译目录或目录内的所有文件,可以使用compile函数。

C:\Users\rajesh>python -m compileall
Skipping current directory
Listing 'C:\Python\Python361\python36.zip'...
Can't list 'C:\Python\Python361\python36.zip'
Listing 'C:\Python\Python361\DLLs'...
Listing 'C:\Python\Python361\lib'...
Listing 'C:\Python\Python361'...
Compiling 'C:\Python\Python361\BeautifulSoup_script1.py'...
Compiling 'C:\Python\Python361\EDA_python1.py'...
Compiling 'C:\Python\Python361\MainP.py'...
Compiling 'C:\Python\Python361\NegativeAgeException.py'...
Compiling 'C:\Python\Python361\NegativeNumberException.py'...
Compiling 'C:\Python\Python361\OtherP.py'...
Compiling 'C:\Python\Python361\__init__ Constructor.py'...
Compiling 'C:\Python\Python361\attribute_access.py'...
…..
…
Compiling 'C:\Python\Python361\variable_arguments_list.py'...
Compiling 'C:\Python\Python361\variable_arguments_list1.py'...
Compiling 'C:\Python\Python361\winquality1.py'...

我们可以看到,为__pycache__目录内的所有文件创建了.pyc文件。

更新于:2019年7月30日

浏览量:1K+

开启你的职业生涯

完成课程获得认证

开始学习
广告