<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[在学习第七章-添加语音播报功能时遇到并尝试解决.venv无法被找到的问题]]></title><description><![CDATA[<p dir="auto">前置条件：构建成功</p>
<pre><code class="language-bash">$ colcon build
Starting &gt;&gt;&gt; autopatrol_interfaces
Starting &gt;&gt;&gt; autopatrol_robot
Starting &gt;&gt;&gt; fishbot_application
Starting &gt;&gt;&gt; fishbot_application_cpp
Starting &gt;&gt;&gt; fishbot_description
Starting &gt;&gt;&gt; fishbot_navigation2
Finished &lt;&lt;&lt; fishbot_description [1.60s]                                                            
Finished &lt;&lt;&lt; fishbot_navigation2 [1.62s]
Finished &lt;&lt;&lt; autopatrol_robot [2.25s]                                                                    
Finished &lt;&lt;&lt; fishbot_application [2.28s]
Finished &lt;&lt;&lt; fishbot_application_cpp [2.32s]                                                                        
Finished &lt;&lt;&lt; autopatrol_interfaces [2.68s]                     

Summary: 6 packages finished [3.03s]
</code></pre>
<p dir="auto">我的开发环境结构如下：<br />
<img src="/forum/assets/uploads/files/1773644271904-3923e4ef-2540-4d37-acaf-9b33668f4d35-%E5%9B%BE%E7%89%87.png" alt="3923e4ef-2540-4d37-acaf-9b33668f4d35-图片.png" class=" img-fluid img-markdown" /><br />
.venv目录即是我的python虚拟环境。<br />
命令行运行<code>which python</code>可以正确显示虚拟环境中的可执行文件</p>
<pre><code class="language-bash">$ which python
/home/yldu/ros2bookcode/chapt7/chapt7_ws/.venv/bin/python
</code></pre>
<p dir="auto">接下来，在运行<code>ros2 run autopatrol_robot speaker </code>时会提示找不到<code>torch</code></p>
<pre><code class="language-bash">$ 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 &lt;module&gt;
    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 "&lt;frozen importlib._bootstrap&gt;", line 1050, in _gcd_import
  File "&lt;frozen importlib._bootstrap&gt;", line 1027, in _find_and_load
  File "&lt;frozen importlib._bootstrap&gt;", line 1006, in _find_and_load_unlocked
  File "&lt;frozen importlib._bootstrap&gt;", line 688, in _load_unlocked
  File "&lt;frozen importlib._bootstrap_external&gt;", line 883, in exec_module
  File "&lt;frozen importlib._bootstrap&gt;", 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 &lt;module&gt;                                                                                                              import torch
ModuleNotFoundError: No module named 'torch'
[ros2run]: Process exited with failure 1
</code></pre>
<p dir="auto">因为我使用了其他语音引擎，因此提示的错误是找不到<code>torch</code>，如果按照课本上的代码会提示找不到<code>espeakng</code>。<br />
打开<code>install/autopatrol_robot/lib/autopatrol_robot/speaker</code>文件，发现第文件头部Shebang（也称 Hashbang）‌ 行为<code>#!/usr/bin/python3</code></p>
<pre><code class="language-python">#!/usr/bin/python3
# EASY-INSTALL-ENTRY-SCRIPT: 'autopatrol-robot==0.0.0','console_scripts','speaker'
import re
import sys
</code></pre>
<p dir="auto">这就与预期不符了，因为我在构建时，虚拟环境已经加载，按说构建后的文件应该使用我虚拟环境中的<code>python</code>。怎么说也不应该使用<code>/usr/bin/python3</code>。<br />
于是我按照小鱼以前说过的<a href="https://fishros.com/d2lros2humble/#/humble/chapt2/basic/5.Python%E4%BE%9D%E8%B5%96%E6%9F%A5%E6%89%BE%E6%B5%81%E7%A8%8B" target="_blank" rel="noopener noreferrer nofollow ugc">动手学ROS2</a>排查<code>$PYTHONPATH</code></p>
<pre><code class="language-bash">(.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                                                                                                                                
</code></pre>
<p dir="auto">没有问题，因为在激活虚拟环境的终端中，应该被包含的包一定存在，否则也不会构建成功。<br />
但是，在虚拟环境之外执行上面的命令</p>
<pre><code>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
</code></pre>
<p dir="auto">显然包含torch的目录没有被包含。也正因为如此，运行时报错了。<br />
好了，问题找到了，接下来就要尝试修复了。<br />
我尝试过把包含torch的目录手动增加到环境变量PYTHONPATH里，发现并不好使，我觉得是因为/usr/bin/python3并不会去搜索虚拟环境下的包。<br />
最近借用各种搜索工具和AI软件分析了很长时间都没弄好。<br />
今天，抱着试试看的态度，我尝试手动把<code>install/autopatrol_robot/lib/autopatrol_robot/speaker</code> 的‌Shebang行的python路径修改为我虚拟环境下的python:</p>
<pre><code>#!/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
</code></pre>
<p dir="auto">神奇的是居然可以运行成功了！</p>
<pre><code>(.venv) yldu@ros2:~/ros2bookcode/chapt7/chapt7_ws$ ros2 run autopatrol_robot speaker 
Fetching 4 files: 100%|█████████████████████████████████████████████████████████████████████████| 4/4 [00:00&lt;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]: 语音服务初始化完成
</code></pre>
<p dir="auto">以上算是给遇到类似问题的小伙伴们提供一个临时解决此问题的方案，但是缺点也很明显，每次使用<code>colcon build</code>重新构建项目后都需要去手动修改install目录文件的 ‌Shebang行。</p>
<p dir="auto">因为对<code>colcon</code>构建工具不很精通，我认为需要给它加上某些参数才能构建生成目标包。接下来我会继续研究着一块内容。</p>
<p dir="auto">如果有知道彻底解决办法的小伙伴也请不吝赐教，提前再此谢过。</p>
]]></description><link>https://fishros.org.cn/forum/topic/4738/在学习第七章-添加语音播报功能时遇到并尝试解决-venv无法被找到的问题</link><generator>RSS for Node</generator><lastBuildDate>Wed, 26 Aug 2026 19:23:53 GMT</lastBuildDate><atom:link href="https://fishros.org.cn/forum/topic/4738.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 16 Mar 2026 07:26:03 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to 在学习第七章-添加语音播报功能时遇到并尝试解决.venv无法被找到的问题 on Mon, 16 Mar 2026 08:34:51 GMT]]></title><description><![CDATA[<p dir="auto"><a class="mention plugin-mentions-user plugin-mentions-a" href="https://fishros.org.cn/forum/uid/30695">@ros_learner</a><br />
补充一点：<br />
在我的项目中，虽然使用ros2 run 无法运行节点，但是在launch文件中运行是正常的。但是我不知道原因。唉，这该死的求知欲。</p>
<pre><code>(.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&lt;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]: 语音合成成功：正在初始化位置
</code></pre>
]]></description><link>https://fishros.org.cn/forum/post/19546</link><guid isPermaLink="true">https://fishros.org.cn/forum/post/19546</guid><dc:creator><![CDATA[ros_learner]]></dc:creator><pubDate>Mon, 16 Mar 2026 08:34:51 GMT</pubDate></item></channel></rss>