擅长:python、mysql、java
<p>我可以通过你的尝试发现几个问题,但我不确定我是否都发现了</p>
<ul>
<li>如果您只想运行子进程,那么应该使用<code>subprocess.check_call</code>或<code>subprocess.run</code>,并使用Python脚本等待子进程完成。如果您需要使用原始的<code>subprocess.Popen()</code>,那么您还需要自己执行一些额外的管道操作步骤,如果您使用这些更高级别的函数,<code>check_call</code>或<code>run</code>将为您执行这些步骤</李>
<li>使用<code>env</code>将<em>替换环境中的变量。而是复制现有环境,这样就不会破坏有用的设置,如<code>PYTHONPATH</code>等,这很可能会阻止子进程找到它需要的库</李>
<li>shell调用似乎是多余的</李>
<li>在<code>'http://10.42.0.49:11311\''</code>结尾的单独引号看起来肯定是错误的</李>
</ul>
<p>有了这一点,请尝试此代码;但如果这还不能完全解决您的问题,请继续进行更好的诊断</p>
<pre class="lang-py prettyprint-override"><code>import subprocess
import os
# ...
env = os.environ.copy()
env['ROS_MASTER_URI'] = 'http://10.42.0.49:11311'
action_publisher = subprocess.run(
["/opt/ros/melodic/bin/rostopic", "pub", "-r", "20",
"/robot_operation", "std_msgs/String", "start"],
env=env, check=True)
</code></pre>
<p>如果<code>rostopic</code>实际上是一个Python程序,那么更好的解决方案可能是直接<code>import</code>它</p>