ROS开发避坑指南:VSCode配置Python3环境与catkin_make常见错误解决

Python 3 和 VSCode:强大的编程组合 Python 3 和 Visual Studio Code(VSCode)是现代软件开发中两个非常受欢迎的工具。Python 3 是一种高级编程语言,以其简洁明了的语法和强大的功能而闻名。VSCode 是由 Microsoft 开发的一款轻量级但功能丰富的源代码编辑器,支持多种编程语言,包括 Python。本文将探讨 Python 3 和 VSCode 的特点、优势以及如何将它们结合起来以提高编程效率。 阅读详情

ROS开发环境深度配置:从Python版本陷阱到高效工作流构建

如果你刚开始接触ROS,大概率已经体会过那种“明明跟着教程一步步走,却卡在某个编译错误上几个小时”的挫败感。ROS作为一个强大的机器人操作系统框架,其生态的复杂性也带来了不少环境配置上的挑战,尤其是当Python 2与Python 3并存,或者开发工具链没有正确设置时。这篇文章不是另一个简单的“Hello World”教程,而是聚焦于那些真正影响开发效率的“坑”,特别是围绕VSCode、catkin_make和Python环境展开。我们将深入探讨如何建立一个健壮、可复现且高效的ROS开发环境,让你能把精力集中在算法和逻辑本身,而不是无休止地解决环境问题。

1. 理解ROS环境与Python版本冲突的根源

很多初学者遇到的第一个拦路虎就是catkin_make编译失败,错误信息常常指向Python模块缺失或版本不匹配。这背后其实是一个历史遗留问题:ROS 1的核心版本(如Melodic、Noetic)在设计之初与特定Python版本深度绑定。例如,ROS Melodic默认使用Python 2.7,而ROS Noetic则转向了Python 3。然而,我们的开发机上往往同时安装了多个Python环境,比如系统自带的Python 3.8、通过apt安装的Python 3.6,或者你自己用conda管理的科学计算环境。

当你在终端输入python时,系统会根据PATH环境变量来决定调用哪个解释器。catkin_make在构建过程中,会调用CMake,而CMake又会去寻找默认的Python解释器来执行一些生成脚本(例如处理*.msg、*.srv文件)。如果你的默认python指向了一个conda环境下的、缺少必要ROS模块(如empy)的解释器,编译就会立刻失败。

注意:错误信息 Unable to find either executable 'empy' or Python module 'em' 就是一个典型标志,说明catkin_make调用的Python解释器路径不对,或者该解释器没有安装empy这个包。

解决这个问题的核心思路是明确指定构建时使用的Python解释器路径。但粗暴地修改系统默认Python链接是危险且不推荐的,因为这可能会破坏系统其他工具的依赖。正确的做法是在构建命令或构建配置中临时指定。

一个基础的解决方案是在命令行中直接指定:

cd ~/your_workspace
catkin_make -DPYTHON_EXECUTABLE=/usr/bin/python3

这条命令告诉CMake,使用位于/usr/bin/python3的解释器。通常,通过系统包管理器(如apt)安装的ROS相关Python包(python3-empy, python3-catkin-pkg等)都会关联到这个解释器。

但每次编译都输入这么长的命令太麻烦,而且在使用VSCode这类IDE进行构建时,我们更需要一个一劳永逸的配置方案。这就引出了我们下一节要讨论的重点:如何将正确的配置集成到你的开发工具链中。

2. 在VSCode中配置稳健的ROS构建任务

VSCode已经成为许多ROS开发者的首选编辑器,其强大的扩展生态和灵活的配置能力功不可没。为了高效开发,我们需要让VSCode的构建命令也能正确处理Python环境。关键在于配置tasks.json文件。

当你第一次在VSCode中打开ROS工作空间,并尝试使用Ctrl+Shift+B进行构建时,VSCode会提示你配置构建任务。它会生成一个.vscode/tasks.json的模板。我们需要修改这个文件,将Python解释器的路径参数固化到构建任务中。

下面是一个针对ROS Melodic(需要Python 3)的tasks.json配置示例。我更喜欢将调试(debug)和发布(release)构建分开,这样更清晰:

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "catkin_make (Debug)",
            "type": "shell",
            "command": "catkin_make",
            "args": [
                "-DCMAKE_BUILD_TYPE=Debug",
                "-DPYTHON_EXECUTABLE=/usr/bin/python3"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "presentation": {
                "reveal": "always",
                "panel": "dedicated"
            },
            "problemMatcher": [
                "$catkin-gcc",
                "$catkin-cmake"
            ]
        },
        {
            "label": "catkin_make (Release)",
            "type": "shell",
            "command": "catkin_make",
            "args": [
                "-DCMAKE_BUILD_TYPE=Release",
                "-DPYTHON_EXECUTABLE=/usr/bin/python3",
                "-DCATKIN_ENABLE_TESTING=0"
            ],
            "group": "build",
            "presentation": {
                "reveal": "always",
                "panel": "dedicated"
            }
        }
    ]
}

配置解析:

  • label: 任务名称,会在VSCode命令面板中显示。
  • args: 这是解决Python问题的关键。我们通过-DPYTHON_EXECUTABLE=/usr/bin/python3明确指定解释器。你应根据自己系统上Python 3的实际路径进行调整(可通过which python3命令查看)。
  • problemMatcher: 我在这里使用了$catkin-gcc和$catkin-cmake,这需要你安装相应的VSCode扩展来提供支持(例如twxs.cmake和ms-vscode.cpptools),它能帮助VSCode将编译器的错误输出链接到源代码的对应行,极大提升调试效率。
  • 分组与面板:将Debug构建设为默认(isDefault: true),这样Ctrl+Shift+B就直接触发它。panel: “dedicated”会将构建输出放在一个独立的终端面板,避免与你的代码编辑区域混淆。

配置好后,每次构建只需按Ctrl+Shift+B,VSCode就会自动使用正确的Python环境进行编译,彻底告别手动输入长命令的烦恼。

3. 构建高效的多终端工作流:超越基础Terminator

教程里常推荐使用Terminator,因为它支持分屏,确实比默认终端方便。但我们可以做得更好。一个高效的ROS开发工作流,往往需要同时运行多个终端:一个用于roscore,一个用于构建,一个用于运行节点,一个用于查看rosout日志或rqt工具。

我个人的终端布局习惯通常是这样的:

  • 左上窗格:永久运行roscore。我会给它一个醒目的标签,比如“MASTER”。
  • 右上窗格:用于构建工作空间(catkin_make)或运行roslaunch。这是活动最频繁的区域。
  • 左下窗格:运行具体的ROS节点,或者使用rostopic echo、rosservice call等命令进行调试。
  • 右下窗格:用于系统监控,如htop查看资源占用,或rqt_graph动态查看节点拓扑。

除了布局,终端环境的初始化也至关重要。每次新开终端都需要手动source devel/setup.bash非常低效。有两个更好的方法:

方法一:修改Shell配置文件 在你的~/.bashrc文件末尾添加针对特定工作空间的source命令。但注意,如果你有多个工作空间,这可能会导致冲突。更精细的做法是使用别名(alias)。

# 在 ~/.bashrc 中添加
alias sws='source ~/catkin_ws/devel/setup.bash'
alias sws2='source ~/another_ws/devel/setup.bash'

这样,在新终端中只需输入sws即可初始化环境。

方法二:使用VSCode的集成终端 VSCode的集成终端可以继承工作区的环境变量。你可以在VSCode的设置(settings.json)中配置,让它在启动终端时自动执行source命令:

{
    "terminal.integrated.shellArgs.linux": ["-c", "source /opt/ros/melodic/setup.bash && source ${workspaceFolder}/devel/setup.bash && exec bash"]
}

这个配置会让VSCode每次打开新终端时,自动初始化ROS和当前工作空间的环境。不过请注意,这个配置可能随着VSCode版本更新而变化,且exec bash是为了启动一个新的bash会话,避免source命令影响终端本身。

工具/方法优点缺点适用场景
Terminator (分屏)布局灵活,可保存布局,资源占用低需要手动source环境,功能相对基础需要固定多任务并行监控的场景
VSCode集成终端与编辑器深度集成,可配置自动初始化环境,问题匹配方便分屏功能较弱,占用编辑界面空间主要开发、构建和单节点调试
Tmux / Screen会话持久化,断开连接不中断任务,高度可定制学习曲线较陡峭远程服务器开发,需要长时间运行任务的场景

选择哪种工具组合,取决于你的个人习惯和项目需求。我通常会在VSCode里进行编码和构建,同时旁边开一个Terminator窗口,按照上述四宫格布局运行roscore和各种调试命令,两者互补。

4. 从源码到运行:Python与C++节点的配置差异

在ROS功能包中创建和运行节点,Python和C++的流程有显著不同,理解这些差异能避免很多低级错误。

Python节点配置要点:

  1. 脚本位置与权限:Python脚本通常放在功能包下的scripts文件夹中。创建后,必须赋予其可执行权限,这是新手常忘的一步。
    cd ~/catkin_ws/src/your_package/scripts
    chmod +x your_node.py
    
  2. Shebang行:脚本第一行的Shebang (#!) 很重要,它告诉系统用哪个解释器执行。对于ROS,推荐使用:
    #!/usr/bin/env python3
    
    这比写死路径(如#!/usr/bin/python3)更灵活,它能自动在环境变量PATH中寻找python3。
  3. CMakeLists.txt配置:Python节点不需要被add_executable编译,但需要被“安装”到合适的位置,以便rosrun能找到。在CMakeLists.txt中,找到catkin_install_python部分:
    catkin_install_python(PROGRAMS scripts/your_node.py
      DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
    )
    
    每次新增Python脚本,都需要在这里添加一行。之后执行catkin_make,这个脚本就会被链接到devel或install空间的相应位置。

C++节点配置要点:

  1. 源码位置:C++源文件通常放在src目录下。
  2. 编译配置:C++节点需要显式地在CMakeLists.txt中声明为可执行文件,并链接库。
    add_executable(your_cpp_node src/your_cpp_node.cpp)
    target_link_libraries(your_cpp_node ${catkin_LIBRARIES})
    
    这里的your_cpp_node是可执行文件的名字,也就是你后续用rosrun时输入的节点名。
  3. 依赖声明:如果你的C++代码使用了其他功能包的消息或服务,还需要在find_package和add_dependencies中添加相应依赖。

一个常见的混淆点是:对于Python节点,rosrun时用的是脚本文件名(不含.py);对于C++节点,rosrun时用的是add_executable里定义的可执行目标名,而不是源文件名。搞清楚这一点,能省去很多“找不到节点”的困惑。

5. 利用Launch文件组织复杂应用与高级调试技巧

当你的项目涉及多个节点时,手动rosrun每个节点变得极其繁琐。launch文件正是为此而生。它不仅能一键启动多个节点,还能设置参数、重映射话题、在特定命名空间中启动节点,功能非常强大。

一个基础的launch文件结构如下:

<launch>
    <!-- 启动一个Python节点 -->
    <node pkg="my_package" type="my_python_node.py" name="py_node" output="screen"/>
    <!-- 启动一个C++节点 -->
    <node pkg="my_package" type="my_cpp_node" name="cpp_node" output="screen">
        <param name="update_rate" value="30.0" />
        <remap from="input_topic" to="processed_data" />
    </node>
    <!-- 启动一个已有包里的节点,比如RViz -->
    <node pkg="rviz" type="rviz" name="rviz" args="-d $(find my_package)/config/rviz_config.rviz"/>
</launch>

关键属性解析:

  • pkg: 节点所在的功能包名。
  • type: 对于C++节点,是可执行文件的名字(即add_executable的目标名);对于Python节点,是脚本文件名(需要带.py后缀)。
  • name: 给节点实例起的名字,在ROS图中唯一标识该节点。你可以启动同一个节点的多个实例,只要name不同。
  • output=”screen”: 将节点的标准输出(stdout和stderr)打印到终端。这在调试初期非常有用,否则日志默认会输出到~/.ros/log下的文件里,不便于实时查看。

提示:在开发调试阶段,建议为所有节点都加上output=”screen”,方便实时查看rospy.loginfo或ROS_INFO的输出。项目稳定后,可以移除它以保持终端整洁。

高级调试技巧:

  1. 使用rqt_console:当多个节点都在输出日志时,终端会变得混乱。rqt_console是一个图形化工具,可以聚合、过滤、高亮显示所有节点的日志消息,是排查复杂问题的利器。直接在终端输入rqt_console即可启动。
  2. 可视化节点拓扑:rqt_graph:它能动态显示当前运行的节点、话题、服务之间的连接关系。当你发现数据没有按预期流动时,用rqt_graph看一眼,能立刻发现是哪个节点没启动,或者话题名是否匹配错误。
  3. 在VSCode中调试C++节点:配置VSCode的launch.json,可以实现对ROS C++节点的源码级调试。你需要指定调试目标为devel空间下编译出的可执行文件,并设置好ROS环境变量。这比单纯打印日志要强大得多,可以设置断点、查看变量、单步执行。
  4. Python节点的远程调试:对于Python节点,可以使用VSCode的Python扩展进行调试。在.vscode/launch.json中配置一个Python: Current File或Python: Attach的配置,结合rosrun或roslaunch启动节点时传入--wait等参数,可以实现附加调试。

环境配置的稳定性是高效ROS开发的基石。花些时间把这些“坑”填平,建立起适合自己的自动化工作流,后续的开发过程会顺畅许多。记住,好的工具配置不是为了炫技,而是为了让你忘记工具的存在,从而全神贯注于解决机器人领域真正有趣的问题。

ROS开发环境搭建指南:VSCode与Terminator高效配置(C++/Python) 本文详细介绍了如何高效搭建ROS开发环境,结合VSCode与Terminator工具链,提升C++/Python开发效率。涵盖Terminator多终端配置、VSCode插件安装、ROS工作空间创建及C++/Python节点开发全流程,特别适合需要同时监控多个节点的ROS开发者。 阅读详情

相关推荐

Ubuntu 20.04安装ROS Noetic完整指南:从环境配置到避坑实战

机器人操作系统(ROS)是一个为机器人软件开发提供工具、库和约定的软件框架,它通过节点通信、话题和服务等机制,实现了机器人模块间的解耦与协作。这一设计原理极大地提升了机器人软件的可复用性和开发效率,其技术价值在于为机器人感知、规划、控制等核心算法提供了标准化的开发与集成平台,广泛应用于自动驾驶、工业机械臂、服务机器人等领域。在ROS生态中,版本匹配至关重要,ROS发行版与Ubuntu LTS版本深度绑定。对于ROS 1的最后一个长期支持版本ROS Noetic Ninjemys,官方唯一完美支持的Ubunt

aodiyi6351的博客 419

Python3开发环境配置:Python3+VsCode【保姆级】

Python安装+VsCode安装+Python开发环境基本配置

用魔法打败魔法,走楼梯啊! 3086

ROS开发入门:创建工作空间与功能包全指南

ROS(Robot Operating System)作为机器人开发的主流框架,其核心概念是工作空间(workspace)和功能包(package)。工作空间采用catkin构建系统管理代码,包含src、build、devel三个标准目录结构。功能包则是ROS的最小功能单元,通过package.xml声明元数据和依赖关系,CMakeLists.txt配置构建规则。掌握这些基础概念后,开发者可以高效组织代码,实现模块化开发。本文以VSCode开发环境为例,详细演示了从环境配置、目录创建到包管理的完整流程,并针

weixin_34034261的博客 361

【Python】Python系列教程--Python3 VScode(三)

Python系列教程–Python3介绍(一)Python系列教程–Python3 环境搭建(二)安装 VS Code安装 VS Code Python 扩展安装 Python 3。

DreamSun的博客 1313

VirtualBox搭建Ubuntu虚拟机配置ROS开发环境指南

虚拟化技术通过创建隔离的计算机系统环境,为软件开发提供一致的运行平台。VirtualBox作为开源虚拟化工具,支持在Windows/Mac主机上运行Ubuntu等Linux系统,解决ROS(Robot Operating System)开发的环境兼容性问题。本文详细介绍使用VirtualBox 7.0+和Ubuntu 20.04 LTS搭建ROS Noetic开发环境的完整流程,包含虚拟机资源配置、系统优化、ROS安装配置等关键技术环节,特别针对国内开发者提供了鱼香ROS一键安装方案。通过3D加速、共享文件

weixin_34023982的博客 398

从‘Hello World’到完整通信:手把手教你用VSCode搭建调试第一个ROS1节点(含Catkin工作空间避坑点)

本文详细介绍了如何使用VSCode搭建和调试ROS1节点,从Catkin工作空间初始化到多节点通信的完整开发流程。涵盖环境配置、节点开发、调试技巧及性能优化,特别针对常见陷阱提供解决方案,帮助开发者快速掌握ROS1节点开发的核心技术。

weixin_30258901的博客 398

Python3 | vscode配置环境

vscode配置python3运行环境

神是念着倒 2406

ROS vscode开发,故障解决

ros用vscodeIDE开发注意事项

wzfafabga的博客 1297

Window下VScode配置 Python3开发环境

vscodehttps://code.visualstudio.com/ 下载 安装vscode,然后再扩展页输出python,点击安装即可。 python下载https://www.python.org/downloads/windows/executable版 4.现在安装Python,选自定义安装,然后加入环境变量,启动cmd输入PATH查看是否添加。 5. 打开vscode,安装常用插件。 6. 配置 点击左上角 “文件” ——> “打开文件夹”,然后新建.p...

mahui85的专栏 1994

ROS开发入门:创建工作空间与功能包详解

ROS(Robot Operating System)是机器人开发中广泛使用的中间件框架,其核心概念包括工作空间(workspace)和功能包(package)。工作空间采用catkin构建系统管理,通过标准化的目录结构(src/build/devel)实现代码与编译结果分离。功能包作为ROS的基本组织单元,通过package.xml声明元数据和依赖关系,CMakeLists.txt定义构建规则。这种架构设计支持模块化开发,便于实现机器人导航、机械臂控制等复杂功能。在Ubuntu系统中,开发者可以使用cat

weixin_33845881的博客 433

Windows 10上ROS2开发环境搭建与Python实践指南

机器人操作系统(ROS)作为机器人开发领域的核心框架,其第二代版本ROS2通过引入数据分发服务(DDS)中间件,实现了真正的分布式、实时通信架构。这一设计使其具备了跨平台能力,打破了传统ROS对Linux系统的依赖。从技术价值看,跨平台特性让开发者能在Windows环境下利用熟悉的工具链进行机器人算法开发、仿真测试和应用部署,显著降低了学习门槛。在应用场景上,这特别适合需要与Windows生态深度集成的项目,如基于视觉的桌面机械臂控制、与CAD软件联动的数字孪生系统等。本文聚焦于在Windows 10上搭建

weixin_34268169的博客 440

【ROS】VSCode + ROS 一站式开发环境配置指南(附常见问题解决方案)

本文详细介绍了如何配置VSCode + ROS一站式开发环境,包括基础软件安装、工作空间创建、功能包配置及常见问题解决方案。通过catkin_make和VSCode插件的结合,显著提升ROS开发效率,特别适合Ubuntu 20.04 + ROS Noetic环境下的开发者。

cuda7parallel的博客 1076

Ubuntu 22.04与ROS 2 Humble环境配置全攻略:从零搭建机器人开发环境

机器人操作系统(ROS)是机器人开发领域的核心框架,它基于分布式计算和节点通信原理,为机器人软件提供了模块化、可复用的架构。ROS 2作为新一代版本,在实时性、跨平台支持和安全性方面实现了显著提升,其技术价值在于为自动驾驶、工业自动化和服务机器人等复杂应用场景提供了标准化的开发平台。环境配置是ROS 2开发的首要步骤,涉及操作系统选择、依赖管理和工具链搭建。本文聚焦于Ubuntu 22.04 LTS与ROS 2 Humble这一主流组合,详细解析了系统安装、软件源配置、核心包部署及常见问题排查,特别针对**

weixin_30599769的博客 434

ROS2安装避坑指南:从环境配置到包编译的实战经验

本文详细介绍了ROS2安装过程中的常见问题及解决方案,从系统环境准备到包编译的实战经验。特别针对Ubuntu 20.04系统,提供了避免locale设置、软件源配置、Python环境冲突等关键问题的实用技巧,帮助开发者高效完成ROS2 Galactic版本的安装与配置。

diyu8056的博客 364

图形学基础|屏幕空间反射(SSR)

图形学基础|屏幕空间反射(SSR) 文章目录图形学基础|屏幕空间反射(SSR)一、前言二、反射技术概述2.1 环境贴图反射2.2 IBL反射2.3 平面反射(Planar Reflections)2.4 屏幕空间反射(Screen Space Reflection)2.4.1 SSR的基本原理2.4.2 SSR的优缺点三、SSR(Screen-Space Reflection)实现3.1 Efficient GPU Screen-Space Ray Tracing3.1.1 2D Raymarching v

【黑键】 3万+

串级PID 位置环+速度环

串级PID 位置环+速度环

weixin_62775618的博客 9109

【已解决】vscode开发ros,快捷键编译

据我的经验来说是完崩了,按照其他帖子的方法是卸载python3-catkin-pkg换一个低版本的,但还是会报错,进一步的错目前又没人解决,所以建议是直接快照恢复,然后改下task就好了。vscode中task.json文件用于定义和配置可以在 VS Code 内部运行的任务(tasks),在这里说的就是将执行ctrl+shift+b映射到执行catkin_make命令。具体方法为修改task文件,让vscode配置catkin配置的更适合用于 ROS 项目,其中使用了专门的。

qq_64931749的博客 535

论文解读--Phase Noise in FMCW Radar Systems

相位噪声是现代雷达、通信、光谱和计量系统的基本性能参数之一。本文提出了一种适用于FMCW雷达系统的相位噪声理论。导出了一个新的设计方程,用于确定雷达系统中允许的源相位噪声电平的最大界。分析了在传输延迟小于参考振荡器相干时间时,相干混频引起的非线性相位噪声去相关函数;讨论了在传输延迟大于参考振荡器相干时间时,目标响应的频谱展宽。提出了收发链中各子系统的影响,并讨论了一种新的ADC相位噪声模型。介绍了相位噪声建模技术,然后将锁相环频率合成器与低噪声频率合成器进行比较,以演示减少相位噪声边带以改善检测和跟踪性能。

奔袭的算法工程师 3767

3rd. VSCode下开发ROS的基本流程(C++/Python)

科普:ROS的文件体系 一个ROS的工作包可以被称为一个”catkin工作空间“, 在这个工作空间中,只含有三个文件夹:bulid, devel 和 src。在编译的过程中,这三个文件夹的工作流程是:src(package 源代码包)—— bulid(cmake&catkin 缓存和中间文件)—— devel(可执行目标文件)。所以在这三个文件夹中最核心的是src文件夹,它是package源代码包的集合,其他两个文件夹是src的编译过程和结果文件。 src文件夹由一个个package软件包组成,

陶小桃Blog 563

Qt 6.5实战:用QMediaPlayer搞定RTSP监控流播放(附LAV Filters解码器避坑指南)

本文详细介绍了如何在Qt 6.5中使用QMediaPlayer实现低延迟RTSP监控流播放,并提供了LAV Filters解码器的配置避坑指南。通过优化缓冲策略和硬件加速设置,显著提升视频流的播放性能和稳定性,适用于工业视觉检测和安防监控等实时场景。

weixin_33712987的博客 402

RGMII时序约束

RGMII时序约束

wudpekerlily的博客 5064

别再死记硬背了!用VSCode+Terminator高效搭建你的第一个ROS Noetic工作空间(附避坑指南)

本文详细介绍了如何利用VSCode和Terminator高效搭建ROS Noetic开发环境,提供从系统配置到工具链集成的完整指南。通过优化终端分屏操作、配置VSCode插件和解决常见兼容性问题,帮助开发者快速构建标准化ROS工作空间,显著提升机器人开发效率。

weixin_42522964的博客 220

Windows 11 安装 Miniconda + Mamba,配置国内源

本文详细介绍了在 Windows 11 系统下安装 Miniconda 并配置 Mamba 的完整流程,包括选择精简版 Miniconda 的理由、安装过程中的关键选项设置、配置清华大学镜像源以加速包下载,以及在 base 环境中设置 pip 国内源。同时说明了 Mamba 相较 Conda 的性能优势,并指导用户完成 Mamba 安装与 Shell 集成,最终通过命令验证环境管理功能,帮助用户构建高效、轻量的 Python 开发环境。

寒水馨 · 轻量级技术文档 · hanshuixin.org 3347
上一篇: 旋转位置编码(RoPE)在长序列建模中的实践与优化
下一篇: 告别重装烦恼:用Systemback+Ventoy一键克隆你的Ubuntu20.04工作环境
寂静夜空35
博客等级 码龄3年 59粉丝 1797原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值