开发者

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

目录
  • 简介
  • pyc
  • pyd
    • 编译生成pyd
      • 准备
      • 过程
      • 操作
    • 将pyd放置到系统位置
    • pyo
      • 总结

        简介

        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=jscythonize('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\libjsx64" "/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文件生ekbLR成使用内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

        0

        上一篇:

        下一篇:

        精彩评论

        暂无评论...
        验证码 换一张
        取 消

        最新开发

        开发排行榜