action_publisher = subprocess.Popen(
["bash", "-c", "/opt/ros/melodic/bin/rostopic pub -r 20 /robot_operation std_msgs/String start"],
env={'ROS_MASTER_URI': 'http://10.42.0.49:11311\''})
我试着运行shell=True和shell=False。也可以用bash调用它,或者只是运行我的可执行文件,我总是会收到一个错误:
Traceback (most recent call last):
File "/opt/ros/melodic/bin/rostopic", line 34, in <module>
import rostopic
ImportError: No module named rostopic
如何使用openthroughpython调用shell可执行文件来消除此问题?尝试了所有可能的组合以及其他堆栈建议的解决方案,但仍然尝试导入可执行文件,而不是在shell上运行它
我可以通过你的尝试发现几个问题,但我不确定我是否都发现了
subprocess.check_call
或subprocess.run
,并使用Python脚本等待子进程完成。如果您需要使用原始的subprocess.Popen()
,那么您还需要自己执行一些额外的管道操作步骤,如果您使用这些更高级别的函数,check_call
或run
将为您执行这些步骤李>env
将替换环境中的变量。而是复制现有环境,这样就不会破坏有用的设置,如PYTHONPATH
等,这很可能会阻止子进程找到它需要的库李>'http://10.42.0.49:11311\''
结尾的单独引号看起来肯定是错误的李>有了这一点,请尝试此代码;但如果这还不能完全解决您的问题,请继续进行更好的诊断
如果
rostopic
实际上是一个Python程序,那么更好的解决方案可能是直接import
它听起来该文件的代码正试图导入Python模块。如果您在尝试从shell在bash/中执行文件时也遇到导入错误,那么它与subprocess.Popen无关
从回溯来看,它看起来像是一个Python文件本身,并且它正在尝试导入该模块,这可以解释为什么在从shell执行它时会看到这个问题
您是否正确地完成了安装,特别是环境设置http://wiki.ros.org/melodic/Installation/Ubuntu#melodic.2FInstallation.2FDebEnvironment.Environment_setup
听起来您需要为特定文件提供源代码,以便在Python模块所在的位置提供正确的路径,以便在执行脚本时可以找到它
据我所知,您的
.Popen
命令将尝试执行bash -c /opt/ros/melodic/bin/rostopic pub -r 20 /robot_operation std_msgs/String start
而
bash -c
后面必须跟一个字符串。因此,您可能需要添加单引号相关问题 更多 >
编程相关推荐