Linux python .venv pip install PyQt5卡住/已杀死

部署运行你感兴趣的模型镜像

pip install PyQt5 因内存不足而失败

1. 问题现象 (Problem Phenomenon)

在 Linux 服务器上,尝试使用 pip 安装 PyQt5 包。执行命令后,安装过程在 Preparing metadata (pyproject.toml) ... 阶段长时间停留,最终以 已杀死 (Killed) 错误告终。

执行的命令:

pip install PyQt5 -i https://pypi.tuna.tsinghua.edu.cn/simple

终端输出:

Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Collecting PyQt5
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/0e/07/c9ed0bd428df6f87183fca565a79fee19fa7c88c7f00a7f011ab4379e77a/PyQt5-5.15.11.tar.gz (3.2 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.2/3.2 MB 2.5 MB/s eta 0:00:00
Installing build dependencies ... done
Getting requirements to build wheel ... done
Preparing metadata (pyproject.toml) ... -已杀死

2. 核心原因分析 (Root Cause Analysis)

2.1 源码编译 (Source Compilation)
  • 从日志中的 .tar.gz 文件可以看出,pip 下载的是源代码包,而非预编译的 Wheel 文件 (.whl)。
  • 这意味着 pip 必须在本地调用 C++ 编译器(如 g++)从头开始编译整个 PyQt5 库。这是一个非常消耗 CPU 和内存资源的过程。
2.2 内存耗尽 (Memory Exhaustion)
  • 在编译过程中,通过 top 命令监控系统状态,发现 Swap 交换空间的总量和可用量均为 0 (MiB Swap: 0.0 total, 0.0 free)。
  • 已杀死 (Killed) 是典型的 内存不足 信号。当物理内存(RAM)和交换空间(Swap)都被耗尽时,Linux 内核的 OOM Killer (Out-of-Memory Killer) 机制会启动,选择性地终止消耗内存最多的进程(在这里就是 C++ 编译器进程)以保护系统免于崩溃。

3. 解决过程与探索 (Troubleshooting Journey)

尝试一:增加 Swap 交换空间

既然根本原因是内存不足,第一个直观的解决方案就是增加虚拟内存。我们通过创建一个 4GB 的 Swap 文件来尝试解决问题。

操作步骤:

# 1. 创建一个 4GB 大小的 swap 文件
sudo fallocate -l 4G /swapfile

# 2. 设置正确的文件权限(关键步骤,防止安全风险)
sudo chmod 600 /swapfile

# 3. 将该文件格式化为 swap 区域
sudo mkswap /swapfile

# 4. 立即启用这个 swap 文件
sudo swapon /swapfile

# 5. [推荐] 配置 fstab,使系统重启后自动挂载
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

结果分析:
在增加了 Swap 空间后,再次尝试 pip install PyQt5。然而,即便后续将 Swap 空间扩大到惊人的 42GB,编译过程依然因内存问题而失败。这表明 PyQt5 的编译对内存的需求极高,或者在特定的低配环境中,单纯增加 Swap 并不足以解决问题。


4. 最终解决方案与最佳实践 (Final Solution & Best Practice)

既然从源码编译的路走不通,我们就应该转变思路:避免在本地编译

最可靠的方法是使用系统自带的包管理器(如 apt)来安装由发行版维护者预编译好的二进制包。这个过程只是简单的文件复制,几乎不消耗编译所需的内存和 CPU。

执行以下命令:

# (适用于 Debian / Ubuntu 等系统)
sudo apt update
sudo apt install python3-pyqt5

执行结果:
命令成功执行,PyQt5 被快速、稳定地安装到系统中,Python 脚本可以正常 import PyQt5 并使用。

5. 结论 (Conclusion)

  1. 直接原因pip install PyQt5 时,由于没有找到合适的 Wheel 包,系统退回到源码编译模式。
  2. 根本原因:源码编译过程消耗的内存远超系统可用物理内存,且没有配置 Swap 空间,导致被 OOM Killer 终止。
  3. 最佳实践:对于像 PyQt5、NumPy、Pandas 这类复杂的、包含 C/C++/Fortran 代码的 Python 库,首选的安装方式是使用系统的包管理器 (apt, yum, dnf 等)。这可以完全绕过耗时且易出错的本地编译过程。
  4. 备用方案:如果必须使用 pip 安装,请确保系统有足够的物理内存和 Swap 交换空间(通常建议 RAM + Swap >= 4GB)来支撑编译过程。

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

# 查看 PyQt5 安装路径 dpkg -L python3-pyqt5 | grep PyQt5 Python 3.12.3 /usr/lib/python3/dist-packages/PyQt5 /usr/lib/python3/dist-packages/PyQt5/Qt.abi3.so /usr/lib/python3/dist-packages/PyQt5/QtCore.abi3.so /usr/lib/python3/dist-packages/PyQt5/QtCore.pyi /usr/lib/python3/dist-packages/PyQt5/QtDBus.abi3.so /usr/lib/python3/dist-packages/PyQt5/QtDBus.pyi /usr/lib/python3/dist-packages/PyQt5/QtDesigner.abi3.so /usr/lib/python3/dist-packages/PyQt5/QtDesigner.pyi /usr/lib/python3/dist-packages/PyQt5/QtGui.abi3.so /usr/lib/python3/dist-packages/PyQt5/QtGui.pyi /usr/lib/python3/dist-packages/PyQt5/QtHelp.abi3.so /usr/lib/python3/dist-packages/PyQt5/QtHelp.pyi /usr/lib/python3/dist-packages/PyQt5/QtNetwork.abi3.so /usr/lib/python3/dist-packages/PyQt5/QtNetwork.pyi /usr/lib/python3/dist-packages/PyQt5/QtPrintSupport.abi3.so /usr/lib/python3/dist-packages/PyQt5/QtPrintSupport.pyi /usr/lib/python3/dist-packages/PyQt5/QtTest.abi3.so /usr/lib/python3/dist-packages/PyQt5/QtTest.pyi /usr/lib/python3/dist-packages/PyQt5/QtWidgets.abi3.so /usr/lib/python3/dist-packages/PyQt5/QtWidgets.pyi /usr/lib/python3/dist-packages/PyQt5/QtXml.abi3.so /usr/lib/python3/dist-packages/PyQt5/QtXml.pyi /usr/lib/python3/dist-packages/PyQt5/__init__.py /usr/lib/python3/dist-packages/PyQt5/py.typed /usr/lib/python3/dist-packages/PyQt5/sip.pyi /usr/lib/python3/dist-packages/PyQt5/uic /usr/lib/python3/dist-packages/PyQt5/uic/Compiler /usr/lib/python3/dist-packages/PyQt5/uic/Compiler/__init__.py /usr/lib/python3/dist-packages/PyQt5/uic/Compiler/compiler.py /usr/lib/python3/dist-packages/PyQt5/uic/Compiler/indenter.py /usr/lib/python3/dist-packages/PyQt5/uic/Compiler/misc.py /usr/lib/python3/dist-packages/PyQt5/uic/Compiler/proxy_metaclass.py /usr/lib/python3/dist-packages/PyQt5/uic/Compiler/qobjectcreator.py /usr/lib/python3/dist-packages/PyQt5/uic/Compiler/qtproxies.py /usr/lib/python3/dist-packages/PyQt5/uic/Loader /usr/lib/python3/dist-packages/PyQt5/uic/Loader/__init__.py /usr/lib/python3/dist-packages/PyQt5/uic/Loader/loader.py /usr/lib/python3/dist-packages/PyQt5/uic/Loader/qobjectcreator.py /usr/lib/python3/dist-packages/PyQt5/uic/__init__.py /usr/lib/python3/dist-packages/PyQt5/uic/driver.py /usr/lib/python3/dist-packages/PyQt5/uic/exceptions.py /usr/lib/python3/dist-packages/PyQt5/uic/icon_cache.py /usr/lib/python3/dist-packages/PyQt5/uic/objcreator.py /usr/lib/python3/dist-packages/PyQt5/uic/port_v3 /usr/lib/python3/dist-packages/PyQt5/uic/port_v3/__init__.py /usr/lib/python3/dist-packages/PyQt5/uic/port_v3/as_string.py /usr/lib/python3/dist-packages/PyQt5/uic/port_v3/ascii_upper.py /usr/lib/python3/dist-packages/PyQt5/uic/port_v3/proxy_base.py /usr/lib/python3/dist-packages/PyQt5/uic/port_v3/string_io.py /usr/lib/python3/dist-packages/PyQt5/uic/properties.py /usr/lib/python3/dist-packages/PyQt5/uic/pyuic.py /usr/lib/python3/dist-packages/PyQt5/uic/uiparser.py /usr/lib/python3/dist-packages/PyQt5/uic/widget-plugins /usr/lib/python3/dist-packages/PyQt5/uic/widget-plugins/qaxcontainer.py /usr/lib/python3/dist-packages/PyQt5/uic/widget-plugins/qscintilla.py /usr/lib/python3/dist-packages/PyQt5/uic/widget-plugins/qtcharts.py /usr/lib/python3/dist-packages/PyQt5/uic/widget-plugins/qtprintsupport.py /usr/lib/python3/dist-packages/PyQt5/uic/widget-plugins/qtquickwidgets.py /usr/lib/python3/dist-packages/PyQt5/uic/widget-plugins/qtwebenginewidgets.py /usr/lib/python3/dist-packages/PyQt5/uic/widget-plugins/qtwebkit.py /usr/lib/python3/dist-packages/PyQt5-5.15.10.dist-info /usr/lib/python3/dist-packages/PyQt5-5.15.10.dist-info/INSTALLER /usr/lib/python3/dist-packages/PyQt5-5.15.10.dist-info/METADATA user0601@LAPTOP-99GE7DPK:~$ ^C user0601@LAPTOP-99GE7DPK:~$ # 检查 APT 安装的 PyQt5 路径 dpkg -L python3-pyqt5 | grep -E "PyQt5.*\.py" /usr/lib/python3/dist-packages/PyQt5/QtCore.pyi /usr/lib/python3/dist-packages/PyQt5/QtDBus.pyi /usr/lib/python3/dist-packages/PyQt5/QtDesigner.pyi /usr/lib/python3/dist-packages/PyQt5/QtGui.pyi /usr/lib/python3/dist-packages/PyQt5/QtHelp.pyi /usr/lib/python3/dist-packages/PyQt5/QtNetwork.pyi /usr/lib/python3/dist-packages/PyQt5/QtPrintSupport.pyi /usr/lib/python3/dist-packages/PyQt5/QtTest.pyi /usr/lib/python3/dist-packages/PyQt5/QtWidgets.pyi /usr/lib/python3/dist-packages/PyQt5/QtXml.pyi /usr/lib/python3/dist-packages/PyQt5/__init__.py /usr/lib/python3/dist-packages/PyQt5/sip.pyi /usr/lib/python3/dist-packages/PyQt5/uic/Compiler/__init__.py /usr/lib/python3/dist-packages/PyQt5/uic/Compiler/compiler.py /usr/lib/python3/dist-packages/PyQt5/uic/Compiler/indenter.py /usr/lib/python3/dist-packages/PyQt5/uic/Compiler/misc.py /usr/lib/python3/dist-packages/PyQt5/uic/Compiler/proxy_metaclass.py /usr/lib/python3/dist-packages/PyQt5/uic/Compiler/qobjectcreator.py /usr/lib/python3/dist-packages/PyQt5/uic/Compiler/qtproxies.py /usr/lib/python3/dist-packages/PyQt5/uic/Loader/__init__.py /usr/lib/python3/dist-packages/PyQt5/uic/Loader/loader.py /usr/lib/python3/dist-packages/PyQt5/uic/Loader/qobjectcreator.py /usr/lib/python3/dist-packages/PyQt5/uic/__init__.py /usr/lib/python3/dist-packages/PyQt5/uic/driver.py /usr/lib/python3/dist-packages/PyQt5/uic/exceptions.py /usr/lib/python3/dist-packages/PyQt5/uic/icon_cache.py /usr/lib/python3/dist-packages/PyQt5/uic/objcreator.py /usr/lib/python3/dist-packages/PyQt5/uic/port_v3/__init__.py /usr/lib/python3/dist-packages/PyQt5/uic/port_v3/as_string.py /usr/lib/python3/dist-packages/PyQt5/uic/port_v3/ascii_upper.py /usr/lib/python3/dist-packages/PyQt5/uic/port_v3/proxy_base.py /usr/lib/python3/dist-packages/PyQt5/uic/port_v3/string_io.py /usr/lib/python3/dist-packages/PyQt5/uic/properties.py /usr/lib/python3/dist-packages/PyQt5/uic/pyuic.py /usr/lib/python3/dist-packages/PyQt5/uic/uiparser.py /usr/lib/python3/dist-packages/PyQt5/uic/widget-plugins/qaxcontainer.py /usr/lib/python3/dist-packages/PyQt5/uic/widget-plugins/qscintilla.py /usr/lib/python3/dist-packages/PyQt5/uic/widget-plugins/qtcharts.py /usr/lib/python3/dist-packages/PyQt5/uic/widget-plugins/qtprintsupport.py /usr/lib/python3/dist-packages/PyQt5/uic/widget-plugins/qtquickwidgets.py /usr/lib/python3/dist-packages/PyQt5/uic/widget-plugins/qtwebenginewidgets.py /usr/lib/python3/dist-packages/PyQt5/uic/widget-plugins/qtwebkit.py user0601@LAPTOP-99GE7DPK:~$ ^C user0601@LAPTOP-99GE7DPK:~$ # 获取当前 Python 版本(例如 3.10) PY_VER=$(python3 -c "import sys; print(f'python{sys.version_info.major}.{sys.version_info.minor}')") # 创建符号链接到正确路径 sudo ln -s /usr/lib/python3/dist-packages/PyQt5 /usr/lib/${PY_VER}/dist-packages/PyQt5 sudo ln -s /usr/lib/python3/dist-packages/sip* /usr/lib/${PY_VER}/dist-packages/ ln: failed to create symbolic link '/usr/lib/python3.12/dist-packages/PyQt5': No such file or directory ln: failed to create symbolic link '/usr/lib/python3.12/dist-packages/': No such file or directory user0601@LAPTOP-99GE7DPK:~$ python3.12 --version Python 3.12.3 user0601@LAPTOP-99GE7DPK:~$ sudo mkdir -p /usr/lib/python3.12/dist-packages user0601@LAPTOP-99GE7DPK:~$ ls -ld /usr/lib/python3.12/dist-packages drwxr-xr-x 2 root root 4096 Sep 24 21:22 /usr/lib/python3.12/dist-packages user0601@LAPTOP-99GE7DPK:~$ sudo ln -s /usr/lib/python3/dist-packages/PyQt5 /usr/lib/python3.12/dist-packages/PyQt5 user0601@LAPTOP-99GE7DPK:~$ ls -l /usr/lib/python3.12/dist-packages/PyQt5 lrwxrwxrwx 1 root root 36 Sep 24 21:23 /usr/lib/python3.12/dist-packages/PyQt5 -> /usr/lib/python3/dist-packages/PyQt5 user0601@LAPTOP-99GE7DPK:~$ python3 1.0.py python3: can't open file '/home/user0601/1.0.py': [Errno 2] No such file or directory user0601@LAPTOP-99GE7DPK:~$ python3 1.0.py Traceback (most recent call last): File "/home/user0601/1.0.py", line 6, in <module> from PyQt5.QtWidgets import ( ModuleNotFoundError: No module named 'PyQt5' user0601@LAPTOP-99GE7DPK:~$ python3.12 -m pip install PyQt5 error: externally-managed-environment × This environment is externally managed ╰─> To install Python packages system-wide, try apt install python3-xyz, where xyz is the package you are trying to install. If you wish to install a non-Debian-packaged Python package, create a virtual environment using python3 -m venv path/to/venv. Then use path/to/venv/bin/python and path/to/venv/bin/pip. Make sure you have python3-full installed. If you wish to install a non-Debian packaged Python application, it may be easiest to use pipx install xyz, which will manage a virtual environment for you. Make sure you have pipx installed. See /usr/share/doc/python3.12/README.venv for more information. note: If you believe this is a mistake, please contact your Python installation or OS distribution provider. You can override this, at the risk of breaking your Python installation or OS, by passing --break-system-packages. hint: See PEP 668 for the detailed specification. user0601@LAPTOP-99GE7DPK:~$
09-25
Traceback (most recent call last): File "/Users/ios/Downloads/linux_1/tools/server_manger_tool/build.py", line 124, in <module> setup( File "/Users/ios/PycharmProjects/pythonProject/.venv/lib/python3.9/site-packages/cx_Freeze/__init__.py", line 66, in setup return setuptools.setup(**attrs) File "/Users/ios/PycharmProjects/pythonProject/.venv/lib/python3.9/site-packages/setuptools/__init__.py", line 103, in setup return distutils.core.setup(**attrs) File "/Users/ios/PycharmProjects/pythonProject/.venv/lib/python3.9/site-packages/setuptools/_distutils/core.py", line 184, in setup return run_commands(dist) File "/Users/ios/PycharmProjects/pythonProject/.venv/lib/python3.9/site-packages/setuptools/_distutils/core.py", line 200, in run_commands dist.run_commands() File "/Users/ios/PycharmProjects/pythonProject/.venv/lib/python3.9/site-packages/setuptools/_distutils/dist.py", line 969, in run_commands self.run_command(cmd) File "/Users/ios/PycharmProjects/pythonProject/.venv/lib/python3.9/site-packages/setuptools/dist.py", line 968, in run_command super().run_command(command) File "/Users/ios/PycharmProjects/pythonProject/.venv/lib/python3.9/site-packages/setuptools/_distutils/dist.py", line 988, in run_command cmd_obj.run() File "/Users/ios/PycharmProjects/pythonProject/.venv/lib/python3.9/site-packages/setuptools/_distutils/command/build.py", line 132, in run self.run_command(cmd_name) File "/Users/ios/PycharmProjects/pythonProject/.venv/lib/python3.9/site-packages/setuptools/_distutils/cmd.py", line 316, in run_command self.distribution.run_command(command) File "/Users/ios/PycharmProjects/pythonProject/.venv/lib/python3.9/site-packages/setuptools/dist.py", line 968, in run_command super().run_command(command) File "/Users/ios/PycharmProjects/pythonProject/.venv/lib/python3.9/site-packages/setuptools/_distutils/dist.py", line 988, in run_command cmd_obj.run() File "/Users/ios/PycharmProjects/pythonProject/.venv/lib/python3.9/site-packages/cx_Freeze/command/build_exe.py", line 298, in run freezer: Freezer = Freezer( File "/Users/ios/PycharmProjects/pythonProject/.venv/lib/python3.9/site-packages/cx_Freeze/freezer.py", line 1128, in __init__ Freezer.__init__(self, *args, **kwargs) File "/Users/ios/PycharmProjects/pythonProject/.venv/lib/python3.9/site-packages/cx_Freeze/freezer.py", line 175, in __init__ self.finder: ModuleFinder = self._get_module_finder() File "/Users/ios/PycharmProjects/pythonProject/.venv/lib/python3.9/site-packages/cx_Freeze/freezer.py", line 422, in _get_module_finder finder.include_package(name) File "/Users/ios/PycharmProjects/pythonProject/.venv/lib/python3.9/site-packages/cx_Freeze/finder.py", line 835, in include_package module = self._import_module(name, deferred_imports) File "/Users/ios/PycharmProjects/pythonProject/.venv/lib/python3.9/site-packages/cx_Freeze/finder.py", line 275, in _import_module module = self._internal_import_module(name, deferred_imports) File "/Users/ios/PycharmProjects/pythonProject/.venv/lib/python3.9/site-packages/cx_Freeze/finder.py", line 362, in _internal_import_module module = self._load_module( File "/Users/ios/PycharmProjects/pythonProject/.venv/lib/python3.9/site-packages/cx_Freeze/finder.py", line 433, in _load_module self._load_module_code(module, loader, deferred_imports) File "/Users/ios/PycharmProjects/pythonProject/.venv/lib/python3.9/site-packages/cx_Freeze/finder.py", line 472, in _load_module_code module.hook(self) File "/Users/ios/PycharmProjects/pythonProject/.venv/lib/python3.9/site-packages/cx_Freeze/hooks/_pyqt5_/__init__.py", line 66, in load_pyqt5 copy_qt_files(finder, "PyQt5", "LibraryExecutablesPath", "qt.conf") File "/Users/ios/PycharmProjects/pythonProject/.venv/lib/python3.9/site-packages/cx_Freeze/hooks/qthooks.py", line 156, in copy_qt_files for source_path, target_path in _get_qt_files(name, variable, arg): File "/Users/ios/PycharmProjects/pythonProject/.venv/lib/python3.9/site-packages/cx_Freeze/hooks/qthooks.py", line 133, in _get_qt_files if source_path.joinpath(arg).is_dir(): AttributeError: 'NoneType' object has no attribute 'joinpath'
07-30
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值