在 Docker 映像上使用 'pip install psutil' python:3.9.13-alpine3.16 错误:找不到 linux/ethtool.h



我试图在dockerpython:3.9.13-alpine3.16中安装python模块psutil
但它报告了以下错误:

Building wheels for collected packages: psutil
Building wheel for psutil (pyproject.toml) ... error
error: subprocess-exited-with-error

× Building wheel for psutil (pyproject.toml) did not run successfully.
│ exit code: 1
╰─> [51 lines of output]
/tmp/tmpb62wij4i.c:1:10: fatal error: linux/ethtool.h: No such file or directory
1 | #include <linux/ethtool.h>
|          ^~~~~~~~~~~~~~~~~
compilation terminated.
running bdist_wheel
running build
running build_py
creating build
creating build/lib.linux-x86_64-cpython-39
creating build/lib.linux-x86_64-cpython-39/psutil
copying psutil/__init__.py -> build/lib.linux-x86_64-cpython-39/psutil
copying psutil/_common.py -> build/lib.linux-x86_64-cpython-39/psutil
copying psutil/_compat.py -> build/lib.linux-x86_64-cpython-39/psutil
copying psutil/_psaix.py -> build/lib.linux-x86_64-cpython-39/psutil
copying psutil/_psbsd.py -> build/lib.linux-x86_64-cpython-39/psutil
copying psutil/_pslinux.py -> build/lib.linux-x86_64-cpython-39/psutil
copying psutil/_psosx.py -> build/lib.linux-x86_64-cpython-39/psutil
copying psutil/_psposix.py -> build/lib.linux-x86_64-cpython-39/psutil
copying psutil/_pssunos.py -> build/lib.linux-x86_64-cpython-39/psutil
copying psutil/_pswindows.py -> build/lib.linux-x86_64-cpython-39/psutil
creating build/lib.linux-x86_64-cpython-39/psutil/tests
copying psutil/tests/__init__.py -> build/lib.linux-x86_64-cpython-39/psutil/tests
copying psutil/tests/__main__.py -> build/lib.linux-x86_64-cpython-39/psutil/tests
copying psutil/tests/foo.py -> build/lib.linux-x86_64-cpython-39/psutil/tests
copying psutil/tests/runner.py -> build/lib.linux-x86_64-cpython-39/psutil/tests
copying psutil/tests/test_aix.py -> build/lib.linux-x86_64-cpython-39/psutil/tests
copying psutil/tests/test_bsd.py -> build/lib.linux-x86_64-cpython-39/psutil/tests
copying psutil/tests/test_connections.py -> build/lib.linux-x86_64-cpython-39/psutil/tests
copying psutil/tests/test_contracts.py -> build/lib.linux-x86_64-cpython-39/psutil/tests
copying psutil/tests/test_linux.py -> build/lib.linux-x86_64-cpython-39/psutil/tests
copying psutil/tests/test_memleaks.py -> build/lib.linux-x86_64-cpython-39/psutil/tests
copying psutil/tests/test_misc.py -> build/lib.linux-x86_64-cpython-39/psutil/tests
copying psutil/tests/test_osx.py -> build/lib.linux-x86_64-cpython-39/psutil/tests
copying psutil/tests/test_posix.py -> build/lib.linux-x86_64-cpython-39/psutil/tests
copying psutil/tests/test_process.py -> build/lib.linux-x86_64-cpython-39/psutil/tests
copying psutil/tests/test_sunos.py -> build/lib.linux-x86_64-cpython-39/psutil/tests
copying psutil/tests/test_system.py -> build/lib.linux-x86_64-cpython-39/psutil/tests
copying psutil/tests/test_testutils.py -> build/lib.linux-x86_64-cpython-39/psutil/tests
copying psutil/tests/test_unicode.py -> build/lib.linux-x86_64-cpython-39/psutil/tests
copying psutil/tests/test_windows.py -> build/lib.linux-x86_64-cpython-39/psutil/tests
running build_ext
building 'psutil._psutil_linux' extension
creating build/temp.linux-x86_64-cpython-39
creating build/temp.linux-x86_64-cpython-39/psutil
gcc -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -DTHREAD_STACK_SIZE=0x100000 -fPIC -DPSUTIL_POSIX=1 -DPSUTIL_SIZEOF_PID_T=4 -DPSUTIL_VERSION=591 -DPSUTIL_LINUX=1 -DPSUTIL_ETHTOOL_MISSING_TYPES=1 -I/usr/local/include/python3.9 -c psutil/_psutil_common.c -o build/temp.linux-x86_64-cpython-39/psutil/_psutil_common.o
gcc -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -DTHREAD_STACK_SIZE=0x100000 -fPIC -DPSUTIL_POSIX=1 -DPSUTIL_SIZEOF_PID_T=4 -DPSUTIL_VERSION=591 -DPSUTIL_LINUX=1 -DPSUTIL_ETHTOOL_MISSING_TYPES=1 -I/usr/local/include/python3.9 -c psutil/_psutil_linux.c -o build/temp.linux-x86_64-cpython-39/psutil/_psutil_linux.o
psutil/_psutil_linux.c:19:10: fatal error: linux/version.h: No such file or directory
19 | #include <linux/version.h>
|          ^~~~~~~~~~~~~~~~~
compilation terminated.
error: command '/usr/bin/gcc' failed with exit code 1
[end of output]

note: This error originates from a subprocess, and is likely not a problem with pip.
ERROR: Failed building wheel for psutil
Failed to build psutil
ERROR: Could not build wheels for psutil, which is required to install pyproject.toml-based projects

复发过程:

  1. docker pull python:3.9.13-alpine3.16
  2. docker run--name alpine-python3-it[image-id]/bin/sh
  3. (在容器中(#apk添加构建基
  4. (在容器中(#pip-install-psutil

密钥错误:

/tmp/tmpb62wij4i.c:1:10: fatal error: linux/ethtool.h: No such file or directory  
1 | #include <linux/ethtool.h>  
|          ^~~~~~~~~~~~~~~~~  

psutil/_psutil_linux.c:19:10: fatal error: linux/version.h: No such file or directory  
19 | #include <linux/version.h>  
|          ^~~~~~~~~~~~~~~~~  
compilation terminated.  
error: command '/usr/bin/gcc' failed with exit code 1  

那么,我需要提前预安装什么才能修复呢?谢谢

您需要添加linux headers包。

apk add build-base linux-headers
python -m pip install psutil

更新0

太好了,您需要linux headers包。但是,为什么需要linux headers包?

这个包为内核源代码中的函数提供数据结构和签名。这些信息是编译调用这些函数的模块所必需的。如果您愿意的话,我们不需要实际的源代码,只需要规范和接口。例如,这是psutil使用主机操作系统的网络实用程序所需的信息。

为什么要将其与实施分开?如今,对于个人电脑来说,这在很大程度上是不必要的。但是,这在存储空间小得多、贵得多的时候非常有用。当您所做的只是构建一个调用ethtool中某个函数的模块时,不需要保留整个内核源代码。

一般来说,任何时候构建一个与linux操作系统交互的模块,都需要安装linux头。