如何调试 PySide6 应用程序的 C++ 扩展?#

在调试 PySide 代码时,通常会希望同时调试 PySide 模块的相应 C++ 扩展。这是通过将调试器附加到 Python 解释器来完成的。在本教程中,我们将向您展示如何构建 Qt 6,使用构建的 Qt 6 构建 PySide6,然后在 Qt Creator 或 VSCode 中开始调试过程。

在 VSCode 中,您应该能够看到 C++ 和 Python 的联合调用堆栈。不幸的是,在 Qt Creator 中,您只能调试 PySide 模块的本地 C++ 代码;也就是说,您无法在 Python 代码中设置断点。

注意

本教程是在 Ubuntu 20.04 LTS 上创建的,调试器为 GDB。因此,本教程主要面向 Linux 用户。尽管如此,每个子部分的说明中都提到了如何在其他平台(setup)上设置一切。

让我们开始吧。

根据您的平台安装所有库依赖项#

sudo apt install libfontconfig1-dev libfreetype6-dev \
libx11-dev libx11-xcb-dev libxext-dev libxfixes-dev \
libxi-dev libxrender-dev libxcb1-dev libxcb-glx0-dev \
libxcb-keysyms1-dev libxcb-image0-dev libxcb-shm0-dev \
libxcb-icccm4-dev libxcb-sync-dev libxcb-xfixes0-dev \
libxcb-shape0-dev libxcb-randr0-dev libxcb-render-util0-dev \
libxcb-util-dev libxcb-xinerama0-dev libxcb-xkb-dev \
libxkbcommon-dev libxkbcommon-x11-dev libatspi2.0-dev \
libopengl0 -y

如果您必须使用 Qt Multimedia 模块,则还必须安装 gstreamer。

sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev \
libgstreamer-plugins-bad1.0-dev gstreamer1.0-plugins-base \
gstreamer1.0-plugins-good gstreamer1.0-plugins-bad \
gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc \
gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl \
gstreamer1.0-gtk3 gstreamer1.0-qt5 gstreamer1.0-pulseaudio

通常,缺少软件包的信息可以通过检查 CMake 构建文件夹中的 config.summary 来找到。

注意

对于其他平台,请使用以下说明安装相同的软件包:[Qt 在 Linux 上的安装](https://doc.qt.ac.cn/qt-6/linux-requirements.html)

构建 Qt#

如果您只想调试 CPython 绑定或您已经有 Qt 6 的 DEBUG_SYMBOLS,则此步骤是可选的。

构建 Qt 有多种方法 - 配置脚本或手动使用 CMake。查找构建系统信息:[Qt 6 构建系统](https://www.qt.io/blog/qt-6-build-system)

  1. 获取源代码。

    git clone git://code.qt.io/qt/qt5.git
    # Get submodules
    cd qt5
    perl init-repository
    
  2. 拥有一旦源代码后,下一步就是使用CMake生成构建文件,然后构建和安装。

    cmake -GNinja -DCMAKE_BUILD_TYPE=Debug \
    -DCMAKE_INSTALL_PREFIX=/path/to/install/Qt -DBUILD_qtwebengine=OFF ..
    cmake --build . --parallel
    cmake --install .
    

    如您所注意到的,我们在构建过程中跳过了Qt WebEngine模块,因为这大大减少了构建时间。然而,PySide6支持Qt WebEngine功能。因此,如果需要,请尽管添加。

有关构建Qt 6的更多说明,请参阅以下链接

binlib 路径添加到环境变量中#

export PATH="/path/to/custom/qt/bin:$PATH"
export LD_LIBRARY_PATH="/path/to/custom/qt/lib:$LD_LIBRARY_PATH"

使用您之前构建的Qt 6构建PySide6#

按照入门 - Qt for Python中提到的步骤操作

您可以使用setup.py--module-subset命令行参数手动选择要安装的模块。这是我的安装脚本

python setup.py install --qpaths=/path/to/qpaths --debug \
--ignore-git --reuse-build

建议使用Python虚拟环境,而不是在全球Python中安装。

使用您首选的IDE调试过程#

以下部分指导您设置Qt Creator或VSCode。