当前位置: 代码网 > it编程>前端脚本>Python > python中pyc、 pyd文件及生成使用完整实例代码

python中pyc、 pyd文件及生成使用完整实例代码

2025年04月12日 Python 我要评论
简介python 源码文件是py后缀,看到py扩展名的文件,那就可用判断其为python代码文件。在python系统里,还有pyc文件和pyd文件。注意: 本操作使用的python为v3.11版本。p

简介

python 源码文件是py后缀,看到py扩展名的文件,那就可用判断其为python代码文件。在python系统里,还有pyc文件和pyd文件。

注意: 本操作使用的python为v3.11版本。

pyc

文件pyc是python编译后,生成的字节码文件。

使用 pyc 可以加快程序的加载速度,但不能加快程序的实际执行速度,这就是解释为什么我们​安装 python 目录很多第三方库下是 pyc 文件的原因,因为它可以使得 import 一些第三方库的速度加快​。

可以使用 python 解释器编译 py 文件 成 pyc 字节码文件。我们正常执行python source.py时,如果有import其它的模块,则会自动创建__pycache__目录,并在该目录下生成pyc文件。

要手动生成pyc文件,使用python命令,使用-m调用compileall模块来进行编译,生成pyc自己码文件。生成的文件名添加了后缀,包括cythonpython的版本号, 如cython_311

执行命令如下:

# 编译指定的文件。
python -m compileall source.py  

或者

# 编译目录下的所有python文件。
python -m compileall ./

pyd

pyd是由c程序编译生成的操作系统的动态连接库文件。它们不是python的字节码文件,而是对应os的可执行的动态连接库文件。

使用时,把pyd文件放置到python安装目录的dlls目录下,可用全局使用该模块。

编译生成pyd

准备

编译生成pyd,需要使用2个模块:

  • cython,如果没有此模块,请先安装pip install cython
  • distutils.core中的setup

过程

在编译生成pyd时,会先使用cython模块功能来创建c代码, 再使用c编译生成动态连接库文件。

操作

  • 编写一个python脚本,来处理要编译的模块源码。
## name pyd_setup.py
from distutils.core import setup
from cython.build import cythonize

setup(ext_modules=cythonize('my_module.py'))

  • 执行脚本 python pyd_setup.py看看提示信息
>python pyd_setup.py
usage: pyd_setup.py [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
   or: pyd_setup.py --help [cmd1 cmd2 ...]
   or: pyd_setup.py --help-commands
   or: pyd_setup.py cmd --help

>python pyd_setup.py --help-commands
standard commands:
  build             build everything needed to install
  build_py          "build" pure python modules (copy to build directory)
  build_ext         build c/c++ extensions (compile/link to build directory)
  build_clib        build c/c++ libraries used by python extensions
  build_scripts     "build" scripts (copy and fixup #! line)
  clean             clean up temporary files from 'build' command
  install           install everything from build directory
  install_lib       install all python modules (extensions and pure python)
  install_headers   install c/c++ header files
  install_scripts   install scripts (python or otherwise)
  install_data      install data files
  sdist             create a source distribution (tarball, zip file, etc.)
  register          register the distribution with the python package index
  bdist             create a built (binary) distribution
  bdist_dumb        create a "dumb" built distribution
  bdist_rpm         create an rpm distribution
  check             perform some checks on the package
  upload            upload binary package to pypi

extra commands:
  alias             define a shortcut to invoke one or more commands
  bdist_egg         create an "egg" distribution
  develop           install package in 'development mode'
  dist_info         create a .dist-info directory
  easy_install      find/get/install python packages
  editable_wheel    create a pep 660 'editable' wheel
  egg_info          create a distribution's .egg-info directory
  install_egg_info  install an .egg-info directory for the package
  rotate            delete older distributions, keeping n newest files
  saveopts          save supplied options to setup.cfg or other config file
  setopt            set an option in setup.cfg or another config file
  test              run unit tests after in-place build (deprecated)
  upload_docs       upload documentation to sites other than pypi such as devpi

usage: pyd_setup.py [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
   or: pyd_setup.py --help [cmd1 cmd2 ...]
   or: pyd_setup.py --help-commands
   or: pyd_setup.py cmd --help

使用子命令build_ext,可用编译生成的c/c++源码,连接生成扩展的动态链接库. 执行

> python.exe  pyd_setup.py build_ext
running build_ext
building 'my_module' extension
creating build
creating build\temp.win-amd64-cpython-311
creating build\temp.win-amd64-cpython-311\release
"c:\program files\microsoft visual studio\2022\community\vc\tools\msvc\14.39.33519\bin\hostx86\x64\cl.exe" /c /nologo /o2 /w3 /gl /dndebug /md -ic:\python311\include -ic:\python311\include "-ic:\program files\microsoft visual studio\2022\community\vc\tools\msvc\14.39.33519\include" "-ic:\program files\microsoft visual studio\2022\community\vc\tools\msvc\14.39.33519\atlmfc\include" "-ic:\program files\microsoft visual studio\2022\community\vc\auxiliary\vs\include" "-ic:\program files (x86)\windows kits\10\include\10.0.22621.0\ucrt" "-ic:\program files (x86)\windows kits\10\\include\10.0.22621.0\\um" "-ic:\program files (x86)\windows kits\10\\include\10.0.22621.0\\shared" "-ic:\program files (x86)\windows kits\10\\include\10.0.22621.0\\winrt" "-ic:\program files (x86)\windows kits\10\\include\10.0.22621.0\\cppwinrt" "-ic:\program files (x86)\windows kits\netfxsdk\4.8\include\um" /tcmy_module.c /fobuild\temp.win-amd64-cpython-311\release\my_module.obj
my_module.c
creating d:\learning\python\basic\build\lib.win-amd64-cpython-311
"c:\program files\microsoft visual studio\2022\community\vc\tools\msvc\14.39.33519\bin\hostx86\x64\link.exe" /nologo /incremental:no /ltcg /dll /manifest:embed,id=2 /manifestuac:no /libpath:c:\python311\libs /libpath:c:\python311 /libpath:c:\python311\pcbuild\amd64 "/libpath:c:\program files\microsoft visual studio\2022\community\vc\tools\msvc\14.39.33519\atlmfc\lib\x64" "/libpath:c:\program files\microsoft visual studio\2022\community\vc\tools\msvc\14.39.33519\lib\x64" "/libpath:c:\program files (x86)\windows kits\netfxsdk\4.8\lib\um\x64" "/libpath:c:\program files (x86)\windows kits\10\lib\10.0.22621.0\ucrt\x64" "/libpath:c:\program files (x86)\windows kits\10\\lib\10.0.22621.0\\um\x64" /export:pyinit_my_module build\temp.win-amd64-cpython-311\release\my_module.obj /out:build\lib.win-amd64-cpython-311\my_module.cp311-win_amd64.pyd /implib:build\temp.win-amd64-cpython-311\release\my_module.cp311-win_amd64.lib
  正在创建库 build\temp.win-amd64-cpython-311\release\my_module.cp311-win_amd64.lib 和对象 build\temp.win-amd64-cpython-311\release\my_module.cp311-win_amd64.exp
正在生成代码
已完成代码的生成

可用看到,创建了my_module.c文件,并使用本地的c编译器进行编译,再连接生成动态库。

可用看到中间生成的目录及文件。

>dir /s build
 
 d:\learning\python\basic\build 的目录

2024/04/16  16:18    <dir>          .
2024/04/16  16:18    <dir>          ..
2024/04/16  16:18    <dir>          lib.win-amd64-cpython-311
2024/04/16  16:18    <dir>          temp.win-amd64-cpython-311
               0 个文件              0 字节

 d:\learning\python\basic\build\lib.win-amd64-cpython-311 的目录

2024/04/16  16:18    <dir>          .
2024/04/16  16:18    <dir>          ..
2024/04/16  16:18            37,376 my_module.cp311-win_amd64.pyd
               1 个文件         37,376 字节

 d:\learning\python\basic\build\temp.win-amd64-cpython-311 的目录

2024/04/16  16:18    <dir>          .
2024/04/16  16:18    <dir>          ..
2024/04/16  16:18    <dir>          release
               0 个文件              0 字节

 d:\learning\python\basic\build\temp.win-amd64-cpython-311\release 的目录

2024/04/16  16:18    <dir>          .
2024/04/16  16:18    <dir>          ..
2024/04/16  16:18               766 my_module.cp311-win_amd64.exp
2024/04/16  16:18             2,048 my_module.cp311-win_amd64.lib
2024/04/16  16:18           345,485 my_module.obj
               3 个文件        348,299 字节

     所列文件总数:
               4 个文件        385,675 字节
              11 个目录 274,485,997,568 可用字节

将pyd放置到系统位置

将pyd文件拷贝到python系统下的dlls下,则可用在python程序中方便地import和使用了。

pyo

在执行python解释器时,如果使用-o 选项来进行优化,python3.5以前的版本运行上面的命令,就会产生pyo文件。从python3.5开始,将不再产生pyo文件,而是[name].cpython-311.opt-1.pyc文件。在生成的字节码文件中,文件名会添加opt-#后缀.

总结

到此这篇关于python中pyc、 pyd文件及生成使用的文章就介绍到这了,更多相关python pyc, pyd文件生成使用内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com