答案,需要使用 auditwheel、delocate 这样的工具 参考: * [python 第三方包安装路径 site-packages 下面的以 .libs 结尾的路径是干嘛的?](https://segmentfault.com/a/1190000044200274) * [How to build and distribute a Python/Cython package that depends on third party libFoo.so](https://link.segmentfault.com/?enc=ZFgOc3rzBVLHf1zCY1LuiQ%3D%3D.3PtcgBn9u%2Bt30NM6M2iD7d4Y%2FeDfaKJHA%2BOBuQVCXLAt%2BKLDW04I2%2FcRj6BCkiQBeuub40rmhCV%2FINIFqk5yUqvenbx75fmYXXgicfRskshcPEteJsgfkNIlH%2BFcrN9l18k%2BDNpQMV7oKGgrdcdLKwFY4xdVzgw7URz4WgSnBuo%3D) * [how to build whl with numpy.libs](https://link.segmentfault.com/?enc=pCu83Pr6TRPPg4QGYqwPeQ%3D%3D.k8p%2B7OFbPy0yFpekV5lylsNhfc4sgHtneKPXRn3Jj77m6nfAhJhxA2bZmraf56Bf) 在 linux 存储这些第四方动态链接库,一般都是放在第三方包同级的 xxx.libs 文件夹下面 但是好像不也全是这样,比如 linux 下的 pandas 包,是放到 `pandas/_libs/` 下面的 ─➤ ll /home/pon/.local/share/virtualenvs/svddb_testing-xLs9aDku/lib/python3.10/site-packages/pandas/_libs/ inode Permissions Links Size Blocks User Group Date Modified Name 17045879 .rw-rw-r-- 1 323 8 pon pon 12 2月 23:52 __init__.py 17045986 drwxrwxr-x 2 - - pon pon 12 2月 23:52 __pycache__ 17045814 .rwxrwxr-x 1 2.0M 3992 pon pon 12 2月 23:52 algos.cpython-310-x86_64-linux-gnu.so 17045831 .rw-rw-r-- 1 440 8 pon pon 12 2月 23:52 algos.pxd 17045877 .rw-rw-r-- 1 15k 32 pon pon 12 2月 23:52 algos.pyi 17045810 .rw-rw-r-- 1 51k 104 pon pon 12 2月 23:52 algos.pyx 17045871 .rw-rw-r-- 1 2.3k 8 pon pon 12 2月 23:52 algos_common_helper.pxi.in 17045863 .rw-rw-r-- 1 6.1k 16 pon pon 12 2月 23:52 algos_take_helper.pxi.in 17045883 .rwxrwxr-x 1 93k 184 pon pon 12 2月 23:52 arrays.cpython-310-x86_64-linux-gnu.so 17045866 .rw-rw-r-- 1 233 8 pon pon 12 2月 23:52 arrays.pxd 17045811 .rw-rw-r-- 1 940 8 pon pon 12 2月 23:52 arrays.pyi 17045808 .rw-rw-r-- 1 5.9k 16 pon pon 12 2月 23:52 arrays.pyx 17045812 .rw-rw-r-- 1 510 8 pon pon 12 2月 23:52 dtypes.pxd 17045874 .rwxrwxr-x 1 2.0M 3952 pon pon 12 2月 23:52 groupby.cpython-310-x86_64-linux-gnu.so 17045829 .rw-rw-r-- 1 6.2k 16 pon pon 12 2月 23:52 groupby.pyi 17045882 .rw-rw-r-- 1 56k 112 pon pon 12 2月 23:52 groupby.pyx 17045826 .rwxrwxr-x 1 192k 376 pon pon 12 2月 23:52 hashing.cpython-310-x86_64-linux-gnu.so 17045841 .rw-rw-r-- 1 181 8 pon pon 12 2月 23:52 hashing.pyi 17045846 .rw-rw-r-- 1 4.8k 16 pon pon 12 2月 23:52 hashing.pyx 17045809 .rwxrwxr-x 1 1.6M 3104 pon pon 12 2月 23:52 hashtable.cpython-310-x86_64-linux-gnu.so 17045845 .rw-rw-r-- 1 3.2k 8 pon pon 12 2月 23:52 hashtable.pxd 17045844 .rw-rw-r-- 1 6.1k 16 pon pon 12 2月 23:52 hashtable.pyi 17045803 .rw-rw-r-- 1 4.6k 16 pon pon 12 2月 23:52 hashtable.pyx 17045857 .rw-rw-r-- 1 48k 96 pon pon 12 2月 23:52 hashtable_class_helper.pxi.in 17045825 .rw-rw-r-- 1 14k 32 pon pon 12 2月 23:52 hashtable_func_helper.pxi.in 17045828 .rwxrwxr-x 1 628k 1232 pon pon 12 2月 23:52 index.cpython-310-x86_64-linux-gnu.so 17045878 .rw-rw-r-- 1 3.1k 8 pon pon 12 2月 23:52 index.pyi 17045800 .rw-rw-r-- 1 34k 72 pon pon 12 2月 23:52 index.pyx 17045869 .rw-rw-r-- 1 2.0k 8 pon pon 12 2月 23:52 index_class_helper.pxi.in 17045870 .rwxrwxr-x 1 50k 104 pon pon 12 2月 23:52 indexing.cpython-310-x86_64-linux-gnu.so 17045819 .rw-rw-r-- 1 427 8 pon pon 12 2月 23:52 indexing.pyi 17045848 .rw-rw-r-- 1 778 8 pon pon 12 2月 23:52 indexing.pyx 17045833 .rwxrwxr-x 1 351k 688 pon pon 12 2月 23:52 internals.cpython-310-x86_64-linux-gnu.so 17045852 .rw-rw-r-- 1 2.4k 8 pon pon 12 2月 23:52 internals.pyi 17045858 .rw-rw-r-- 1 24k 48 pon pon 12 2月 23:52 internals.pyx 17045862 .rwxrwxr-x 1 1.4M 2672 pon pon 12 2月 23:52 interval.cpython-310-x86_64-linux-gnu.so 17045853 .rw-rw-r-- 1 5.4k 16 pon pon 12 2月 23:52 interval.pyi 17045820 .rw-rw-r-- 1 18k 40 pon pon 12 2月 23:52 interval.pyx 17045835 .rw-rw-r-- 1 15k 32 pon pon 12 2月 23:52 intervaltree.pxi.in 17045815 .rwxrwxr-x 1 2.5M 4904 pon pon 12 2月 23:52 join.cpython-310-x86_64-linux-gnu.so 17045807 .rw-rw-r-- 1 2.6k 8 pon pon 12 2月 23:52 join.pyi 17045851 .rw-rw-r-- 1 28k 56 pon pon 12 2月 23:52 join.pyx 17045832 .rwxrwxr-x 1 94k 184 pon pon 12 2月 23:52 json.cpython-310-x86_64-linux-gnu.so 17045842 .rw-rw-r-- 1 484 8 pon pon 12 2月 23:52 json.pyi 17045864 .rw-rw-r-- 1 3.8k 8 pon pon 12 2月 23:52 khash.pxd 17045813 .rw-rw-r-- 1 1.4k 8 pon pon 12 2月 23:52 khash_for_primitive_helper.pxi.in 17045801 .rwxrwxr-x 1 702k 1376 pon pon 12 2月 23:52 lib.cpython-310-x86_64-linux-gnu.so 17045849 .rw-rw-r-- 1 139 8 pon pon 12 2月 23:52 lib.pxd 17045837 .rw-rw-r-- 1 7.7k 16 pon pon 12 2月 23:52 lib.pyi 17045821 .rw-rw-r-- 1 92k 184 pon pon 12 2月 23:52 lib.pyx 17045805 .rwxrwxr-x 1 193k 384 pon pon 12 2月 23:52 missing.cpython-310-x86_64-linux-gnu.so 17045824 .rw-rw-r-- 1 408 8 pon pon 12 2月 23:52 missing.pxd 17045872 .rw-rw-r-- 1 675 8 pon pon 12 2月 23:52 missing.pyi 17045834 .rw-rw-r-- 1 14k 32 pon pon 12 2月 23:52 missing.pyx 17045868 .rwxrwxr-x 1 240k 472 pon pon 12 2月 23:52 ops.cpython-310-x86_64-linux-gnu.so 17045855 .rw-rw-r-- 1 1.3k 8 pon pon 12 2月 23:52 ops.pyi 17045850 .rw-rw-r-- 1 7.8k 16 pon pon 12 2月 23:52 ops.pyx 17045802 .rwxrwxr-x 1 61k 120 pon pon 12 2月 23:52 ops_dispatch.cpython-310-x86_64-linux-gnu.so 17045817 .rw-rw-r-- 1 124 8 pon pon 12 2月 23:52 ops_dispatch.pyi 17045839 .rw-rw-r-- 1 2.6k 8 pon pon 12 2月 23:52 ops_dispatch.pyx 17045822 .rwxrwxr-x 1 543k 1064 pon pon 12 2月 23:52 parsers.cpython-310-x86_64-linux-gnu.so 17045830 .rw-rw-r-- 1 2.2k 8 pon pon 12 2月 23:52 parsers.pyi 17045818 .rw-rw-r-- 1 70k 136 pon pon 12 2月 23:52 parsers.pyx 17045816 .rwxrwxr-x 1 63k 128 pon pon 12 2月 23:52 properties.cpython-310-x86_64-linux-gnu.so 17045806 .rw-rw-r-- 1 718 8 pon pon 12 2月 23:52 properties.pyi 17045881 .rw-rw-r-- 1 1.6k 8 pon pon 12 2月 23:52 properties.pyx 17045867 .rwxrwxr-x 1 32k 64 pon pon 12 2月 23:52 reduction.cpython-310-x86_64-linux-gnu.so 17045859 .rw-rw-r-- 1 214 8 pon pon 12 2月 23:52 reduction.pyi 17045838 .rw-rw-r-- 1 1.1k 8 pon pon 12 2月 23:52 reduction.pyx 17045827 .rwxrwxr-x 1 272k 536 pon pon 12 2月 23:52 reshape.cpython-310-x86_64-linux-gnu.so 17045873 .rw-rw-r-- 1 419 8 pon pon 12 2月 23:52 reshape.pyi 17045875 .rw-rw-r-- 1 3.4k 8 pon pon 12 2月 23:52 reshape.pyx 17045843 .rwxrwxr-x 1 870k 1704 pon pon 12 2月 23:52 sparse.cpython-310-x86_64-linux-gnu.so 17045856 .rw-rw-r-- 1 1.4k 8 pon pon 12 2月 23:52 sparse.pyi 17045884 .rw-rw-r-- 1 21k 48 pon pon 12 2月 23:52 sparse.pyx 17045804 .rw-rw-r-- 1 9.4k 24 pon pon 12 2月 23:52 sparse_op_helper.pxi.in 17045823 .rwxrwxr-x 1 93k 184 pon pon 12 2月 23:52 testing.cpython-310-x86_64-linux-gnu.so 17045861 .rw-rw-r-- 1 243 8 pon pon 12 2月 23:52 testing.pyi 17045847 .rw-rw-r-- 1 5.9k 16 pon pon 12 2月 23:52 testing.pyx 17045840 .rwxrwxr-x 1 331k 648 pon pon 12 2月 23:52 tslib.cpython-310-x86_64-linux-gnu.so 17045865 .rw-rw-r-- 1 766 8 pon pon 12 2月 23:52 tslib.pyi 17045854 .rw-rw-r-- 1 29k 64 pon pon 12 2月 23:52 tslib.pyx 17045885 drwxrwxr-x 3 - - pon pon 12 2月 23:52 tslibs 17045880 .rw-rw-r-- 1 272 8 pon pon 12 2月 23:52 util.pxd 17045948 drwxrwxr-x 3 - - pon pon 12 2月 23:52 window 17045836 .rwxrwxr-x 1 221k 432 pon pon 12 2月 23:52 writers.cpython-310-x86_64-linux-gnu.so 17045876 .rw-rw-r-- 1 543 8 pon pon 12 2月 23:52 writers.pyi 17045860 .rw-rw-r-- 1 4.5k 16 pon pon 12 2月 23:52 writers.pyx * * * 好了,回答问题本身 我一开始是以 pyav 为切入点,但是 pyav 的 github 的仓库中,并没有提供任何线索来告诉我,这些 libav 相关的第四方依赖是怎么进入 wheel 文件的 但是我发现还有其他库也是这样实现的 (svddb_sdk) ╭─pon@amd5700g ~/.local/share/virtualenvs/svddb_sdk-oJGZEtXx/lib/python3.10/site-packages ╰─➤ ll | grep .libs 17056431 drwxrwxr-x 2 - - pon pon 12 2月 23:56 av.libs 17060238 drwxrwxr-x 2 - - pon pon 12 2月 23:56 numpy.libs 17073792 drwxrwxr-x 2 - - pon pon 12 2月 23:56 opencv_python.libs 17060002 drwxrwxr-x 2 - - pon pon 12 2月 23:56 Pillow.libs 17182651 drwxrwxr-x 2 - - pon pon 12 2月 23:56 torchvision.libs 所以,可以从 numpy、Pillow 入手研究也可以 (未完待续) * * * 所以,我们正常执行 pyav 的编译之后 > > git clone git@github.com:PyAV-Org/PyAV > cd PyAV > source scripts/activate.sh > > # Either install the testing dependencies: > pip install --upgrade -r tests/requirements.txt > # or have it all, including FFmpeg, built/installed for you: > ./scripts/build-deps > > # Build PyAV. > make 在执行 `python setup.py sdist bdist_wheel` 生成对应的 wheel 文件,比如生成 `dist/av-10.0.0-cp310-cp310-linux_x86_64.whl` 然后使用 [编译 pyav 成 wheel 并使用 auditwheel 固化动态链接库](https://segmentfault.com/a/1190000044262446) 里面的方式,使用 auditwheel repair 实现偷天换日 想验证替换是否成功了?执行 `auditwheel show ./wheelhouse/av-10.0.0-cp310-cp310-manylinux_2_35_x86_64.whl` 查看 wheel 文件信息即可 注意,此时的 wheel 名称和之前不一样了,会变成类似这样的格式: `wheelhouse/av-10.0.0-cp310-cp310-manylinux_2_35_x86_64.whl` > 如果你想知道 `manylinux_2_35` > 是什么含义,可以参考:[pypa/manylinux](https://link.segmentfault.com/?enc=m9CTcFbO8d9CISe3I787kg%3D%3D.t6kPNpVBb%2B%2BNyhQnktgQUGXRepD8jNChpQo2h2dklhJ%2BrrPrwRMVszhA9TgbIOva) * * * 一些子问题: * 如何查看一个动态链接库中的依赖的其他动态链接库是绝对地址引用还是名字引用?参考: * * * 打包的时候,需要注意宿主机的各种环境 可参考: * [https://github.com/mayeut/pep600_compliance](https://link.segmentfault.com/?enc=W70bGqzjLuSLXXS9FM5DGQ%3D%3D.v6FAC3lETdRPQ5i7MsbZyubMRXGcssDUoW%2FaxzCoq%2BylFwcqbaV%2F2tqrnSqheqp4) * [https://github.com/pypa/auditwheel](https://link.segmentfault.com/?enc=iMQmuyabj%2FlGhb8veD786w%3D%3D.cj%2FA05lpRvqSfa8X77Hgxj2B5uc%2FF6dOCQMWeunnjd94jtIkmilWQVTh8M7mYjPg)