简介
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自己码文件。生成的文件名添加了后缀,包括cython
后python的版本号
, 如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文件生成使用内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论