Popen试图打开模块而不是在shell上执行它

2024-09-30 20:37:01 发布

您现在位置:Python中文网/ 问答频道 /正文

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上运行它


Tags: bash可执行文件binrobotactionrosshellpublisher
3条回答

我可以通过你的尝试发现几个问题,但我不确定我是否都发现了

  • 如果您只想运行子进程,那么应该使用subprocess.check_callsubprocess.run,并使用Python脚本等待子进程完成。如果您需要使用原始的subprocess.Popen(),那么您还需要自己执行一些额外的管道操作步骤,如果您使用这些更高级别的函数,check_callrun将为您执行这些步骤
  • 使用env替换环境中的变量。而是复制现有环境,这样就不会破坏有用的设置,如PYTHONPATH等,这很可能会阻止子进程找到它需要的库
  • shell调用似乎是多余的
  • 'http://10.42.0.49:11311\''结尾的单独引号看起来肯定是错误的

有了这一点,请尝试此代码;但如果这还不能完全解决您的问题,请继续进行更好的诊断

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)

如果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后面必须跟一个字符串。因此,您可能需要添加单引号

相关问题 更多 >