whl编译命令使用场景举例
按照项目中包含的文件类型划分场景
1. 包含C/C++扩展模块的python项目
其中包含 .py文件、.pyx文件、(.c文件等)
这种python项目包含C/C++扩展,打包成whl文件时,必须首先把C/C++扩展相关的代码编译成.so或者.pyd文件,然后再打包成.whl。不然打包过程会因为找不到C/C++扩展的编译产物而报错。
所以推荐的命令使用流程是:
python setup.py build_ext
python setup.py bdist_wheel
2.不包含C/C++扩展模块的python项目
这种项目中程序文件只有.py文件,打包成whl文件时,可以直接运行python setup.py bdist_wheel命令打包出.whl文件。
生成源码分发包
sdist作用是生成源码分发包
是把所有源码文件都放到.tar.gz文件中,所有项目中无论是否包含C/C++扩展模块都没关系,都可以直接运行python setup.py sdist命令得到.tar.gz文件。其中包含了项目的所有源码文件如: .py文件、.pyx文件、(.c文件)等。
python项目打包成看不到源码的whl包
如果不想让使用你发布的包的用户看到你的源码,对于python包中不同的文件处理方式不同。
1、对于C/C++扩展文件如pyx文件c文件cpp文件,他们会经历cython编译器编译和c编译器最终生成pyd或者so文件,并且最终打包为whl的命令不会把pyx文件c文件cpp文件放入whl包中所以不用做特殊处理。
2、对于py文件,如果不做特殊处理的话,打包whl的命令最终会把py文件的源码直接放入whl包中。我这里总结了两种处理方式可以让最终让whl中没有py文件的源码。
第一种方式是把py文件通过cython编译器编译成c文件,然后通过cl编译器编译成pyd或者so文件。
编译pyd或者so文件相关命令示例:
cython mypkg/foo.py -o build/foo.c
cl /c /O2 /MD /I"%PYTHON_INCLUDE%" build\foo.c
cl /DLL foo.obj /link /OUT:mypkg\foo.pyd /LIBPATH:"%PYTHON_LIBDIR%" python39.lib
打包whl文件示例:
默认情况:如果不删除 .py 文件,最终 wheel 包中会同时包含 .py 和 .pyd/.so。
如果想让 wheel 只包含 .pyd/.so,有两种方法:
打包前删除 .py 文件(常见做法)
修改 setup.py / MANIFEST.in / package_data 设置,显式排除 .py 文件
py -m pip install --upgrade pip setuptools wheel cython build
# 在 VS Developer Command Prompt 中:
py setup.py build_ext --inplace
py -m build --wheel
第二种方式是把py文件编译成pyc文件,然后删除py文件,bdist_wheel命令打包的whl包种就没有py文件。
python -m compileall -b -f mypkg
find mypkg -name "*.py" -delete
# (准备 MANIFEST.in 包含 *.pyc)
python -m build --wheel