在学习第七章-添加语音播报功能时遇到并尝试解决.venv无法被找到的问题
-
前置条件:构建成功
$ colcon build Starting >>> autopatrol_interfaces Starting >>> autopatrol_robot Starting >>> fishbot_application Starting >>> fishbot_application_cpp Starting >>> fishbot_description Starting >>> fishbot_navigation2 Finished <<< fishbot_description [1.60s] Finished <<< fishbot_navigation2 [1.62s] Finished <<< autopatrol_robot [2.25s] Finished <<< fishbot_application [2.28s] Finished <<< fishbot_application_cpp [2.32s] Finished <<< autopatrol_interfaces [2.68s] Summary: 6 packages finished [3.03s]我的开发环境结构如下:

.venv目录即是我的python虚拟环境。
命令行运行which python可以正确显示虚拟环境中的可执行文件$ which python /home/yldu/ros2bookcode/chapt7/chapt7_ws/.venv/bin/python接下来,在运行
ros2 run autopatrol_robot speaker时会提示找不到torch$ ros2 run autopatrol_robot speaker Traceback (most recent call last): File "/home/yldu/ros2bookcode/chapt7/chapt7_ws/install/autopatrol_robot/lib/autopatrol_robot/speaker", line 33, in <module> sys.exit(load_entry_point('autopatrol-robot==0.0.0', 'console_scripts', 'speaker')()) File "/home/yldu/ros2bookcode/chapt7/chapt7_ws/install/autopatrol_robot/lib/autopatrol_robot/speaker", line 25, in importlib_lo ad_entry_point return next(matches).load() File "/usr/lib/python3.10/importlib/metadata/__init__.py", line 171, in load module = import_module(match.group('module')) File "/usr/lib/python3.10/importlib/__init__.py", line 126, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "<frozen importlib._bootstrap>", line 1050, in _gcd_import File "<frozen importlib._bootstrap>", line 1027, in _find_and_load File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 688, in _load_unlocked File "<frozen importlib._bootstrap_external>", line 883, in exec_module File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed File "~/ros2bookcode/chapt7/chapt7_ws/install/autopatrol_robot/lib/python3.10/site-packages/autopatrol_robot/speaker.py", line 5, in <module> import torch ModuleNotFoundError: No module named 'torch' [ros2run]: Process exited with failure 1因为我使用了其他语音引擎,因此提示的错误是找不到
torch,如果按照课本上的代码会提示找不到espeakng。
打开install/autopatrol_robot/lib/autopatrol_robot/speaker文件,发现第文件头部Shebang(也称 Hashbang) 行为#!/usr/bin/python3#!/usr/bin/python3 # EASY-INSTALL-ENTRY-SCRIPT: 'autopatrol-robot==0.0.0','console_scripts','speaker' import re import sys这就与预期不符了,因为我在构建时,虚拟环境已经加载,按说构建后的文件应该使用我虚拟环境中的
python。怎么说也不应该使用/usr/bin/python3。
于是我按照小鱼以前说过的动手学ROS2排查$PYTHONPATH(.venv) yldu@ros2:~$ echo $PYTHONPATH /home/yldu/ros2bookcode/chapt7/chapt7_ws/install/fishbot_application/lib/python3.10/site-packages:/home/yldu/ros2bookcode/chapt7/ chapt7_ws/install/autopatrol_robot/lib/python3.10/site-packages:/home/yldu/ros2bookcode/chapt7/chapt7_ws/install/autopatrol_interfaces/lib/python3.10/site-packages:/opt/ros/humble/lib/python3.10/site-packages:/opt/ros/humble/local/lib/python3.10/dist-packages没有问题,因为在激活虚拟环境的终端中,应该被包含的包一定存在,否则也不会构建成功。
但是,在虚拟环境之外执行上面的命令yldu@ros2:~$ which python /usr/bin/python yldu@ros2:~$ echo $PYTHONPATH /opt/ros/humble/lib/python3.10/site-packages:/opt/ros/humble/local/lib/python3.10/dist-packages显然包含torch的目录没有被包含。也正因为如此,运行时报错了。
好了,问题找到了,接下来就要尝试修复了。
我尝试过把包含torch的目录手动增加到环境变量PYTHONPATH里,发现并不好使,我觉得是因为/usr/bin/python3并不会去搜索虚拟环境下的包。
最近借用各种搜索工具和AI软件分析了很长时间都没弄好。
今天,抱着试试看的态度,我尝试手动把install/autopatrol_robot/lib/autopatrol_robot/speaker的Shebang行的python路径修改为我虚拟环境下的python:#!/home/yldu/ros2bookcode/chapt7/chapt7_ws/.venv/bin/python # EASY-INSTALL-ENTRY-SCRIPT: 'autopatrol-robot==0.0.0','console_scripts','speaker' import re import sys神奇的是居然可以运行成功了!
(.venv) yldu@ros2:~/ros2bookcode/chapt7/chapt7_ws$ ros2 run autopatrol_robot speaker Fetching 4 files: 100%|█████████████████████████████████████████████████████████████████████████| 4/4 [00:00<00:00, 74898.29it/s] [INFO] [1773645156.986453996] [speaker]: json_path:/home/yldu/ros2bookcode/chapt7/cache file: chapt7_ws/src/autopatrol_robot/cache/sound.json [INFO] [1773645156.987298824] [speaker]: cache:[{'key': '正在初始化位置', 'file': '正在初始化位置.wav'}, {'key': '位置初始化完成', 'file': '位置初始化完成.wav'}, {'key': '准备前往第1个目标点', 'file': '准备前往第1个目标点.wav'}, {'key': '已到达第1个目标点,准备记录图像', 'file': '已到达第1个目标点,准备记录图像.wav'}, {'key': '完成', 'file': '完成.wav'}, {'key': '图像记录完成', 'file': '图像记录完成.wav'}, {'key': '准备前往第2个目标点', 'file': '准备前往第2个目标点.wav'}, {'key': '已到达第2个目标点,准备记录图像', 'file': '已到达第2个目标点,准备记录图像.wav'}, {'key': '准备前往第3个目标点', 'file': '准备前往第3个目标点.wav'}, {'key': '已到达第3个目标点,准备记录图像', 'file': '已到达第3个目标点,准备记录图像.wav'}, {'key': '准备前往第4个目标点', 'file': '准备前往第4个目标点.wav'}, {'key': '已到达第4个目标点,准备记录图像', 'file': '已到达第4个目标点,准备记录图像.wav'}, {'key': '准备前往第5个目标点', 'file': '准备前往第5个目标点.wav'}, {'key': '已到达第5个目标点,准备记录图像', 'file': '已到达第5个目标点,准备记录图像.wav'}] [INFO] [1773645156.987863848] [speaker]: 语音服务初始化完成以上算是给遇到类似问题的小伙伴们提供一个临时解决此问题的方案,但是缺点也很明显,每次使用
colcon build重新构建项目后都需要去手动修改install目录文件的 Shebang行。因为对
colcon构建工具不很精通,我认为需要给它加上某些参数才能构建生成目标包。接下来我会继续研究着一块内容。如果有知道彻底解决办法的小伙伴也请不吝赐教,提前再此谢过。
-
@ros_learner
补充一点:
在我的项目中,虽然使用ros2 run 无法运行节点,但是在launch文件中运行是正常的。但是我不知道原因。唉,这该死的求知欲。(.venv) yldu@ros2:~/ros2bookcode/chapt7/chapt7_ws$ ros2 launch autopatrol_robot autopatrol.launch.py [INFO] [launch]: All log files can be found below /home/yldu/.ros/log/2026-03-16-16-30-49-283834-fpqc-ros2-81778 [INFO] [launch]: Default logging verbosity is set to INFO [INFO] [patrol_node-1]: process started with pid [81781] [INFO] [speaker-2]: process started with pid [81783] [patrol_node-1] [INFO] [1773649851.420133849] [patrol_node]: 语合成服务未上线,等待中。。。 [patrol_node-1] [INFO] [1773649852.422847601] [patrol_node]: 语合成服务未上线,等待中。。。 [patrol_node-1] [INFO] [1773649853.425651579] [patrol_node]: 语合成服务未上线,等待中。。。 [patrol_node-1] [INFO] [1773649854.427882038] [patrol_node]: 语合成服务未上线,等待中。。。 [patrol_node-1] [INFO] [1773649855.429960698] [patrol_node]: 语合成服务未上线,等待中。。。 Fetching 4 files: 100%|██████████| 4/4 [00:00<00:00, 88301.14it/s] [speaker-2] '(ReadTimeoutError("HTTPSConnectionPool(host='hf-mirror.com', port=443): Read timed out. (read timeout=10)"), '(Request ID: 0f87d586-c460-487e-896e-2550f42620e6)')' thrown while requesting HEAD https://hf-mirror.com/Qwen/Qwen3-TTS-12Hz-0.6B-CustomVoice/resolve/main/chat_template.jinja [speaker-2] Retrying in 1s [Retry 1/5]. [speaker-2] [INFO] [1773649967.910855302] [speaker]: json_path:/home/yldu/ros2bookcode/chapt7/chapt7_ws/src/autopatrol_robot/cache/sound.json [speaker-2] [INFO] [1773649967.911412554] [speaker]: cache:[{'key': '正在初始化位置', 'file': '正在初始化位置.wav'}, {'key': '位置初始化完成', 'file': '位置初始化完成.wav'}, {'key': '准备前往第1个目标点', 'file': '准备前往第1个目标点.wav'}, {'key': '已到达第1个目标点,准备记录图像', 'file': '已到达第1个目标点,准备记录图像.wav'}, {'key': '图像记录完成', 'file': '图像记录完成.wav'}, {'key': '准备前往第2个目标点', 'file': '准备前往第2个目标点.wav'}, {'key': '已到达第2个目标点,准备记录图像', 'file': '已到达第2个目标点,准备记录图像.wav'}, {'key': '准备前往第3个目标点', 'file': '准备前往第3个目标点.wav'}, {'key': '已到达第3个目标点,准备记录图像', 'file': '已到达第3个目标点,准备记录图像.wav'}, {'key': '准备前往第4个目标点', 'file': '准备前往第4个目标点.wav'}, {'key': '已到达第4个目标点,准备记录图像', 'file': '已到达第4个目标点,准备记录图像.wav'}, {'key': '准备前往第5个目标点', 'file': '准备前往第5个目标点.wav'}, {'key': '已到达第5个目标点,准备记录图像', 'file': '已到达第5个目标点,准备记录图像.wav'}] [speaker-2] [INFO] [1773649967.911753839] [speaker]: 语音服务初始化完成 [speaker-2] [INFO] [1773649967.912593998] [speaker]: 正在朗读 正在初始化位置 [speaker-2] [INFO] [1773649967.912979030] [speaker]: Playing cached audio for text: 正在初始化位置 [patrol_node-1] [INFO] [1773649970.601738518] [patrol_node]: 语音合成成功:正在初始化位置