rba*_*dar 1 python arguments subprocess popen ros
我目前正在研究为 ROS(机器人操作系统)创建一个通用配置工具。使用subprocess.POpen()并且Tkinter我正在创建treeview这样的:
由于简洁的方式rospack list(列出系统上安装的所有软件包的命令,包括开发人员在其中创建自己的软件包的相应工作区中的软件包)的工作方式,前两列的创建相当简单:
ros_packages_install_retrieve = subprocess.Popen(["rospack list"], shell=True, stdout=subprocess.PIPE)
ros_packages_installed = []
for ros_package in ros_packages_install_retrieve.stdout.readlines():
ros_package_adapted = ros_package.split(" ")
ros_package_adapted[1] = ros_package_adapted[1][:-1]
ros_packages_installed.append(ros_package_adapted)
Run Code Online (Sandbox Code Playgroud)
由于调用问题, “要求”列是一个棘手的问题rospack depends <package>(列出(如果有的话)系统上需要存在的所有软件包<package>,以便构建和/或运行)。对于里面的每个包,ros_packages_installed我调用以下函数:
def get_deps(ros_package):
ros_package_deps_retrieve = subprocess.Popen(["rospack", "depends", ros_package], shell=True, stdout=subprocess.PIPE)
ros_package_deps = []
for ros_package_dep in ros_package_deps_retrieve.stdout.readlines():
ros_package_dep = ros_package_dep.split("\n")
ros_package_dep = ros_package_dep[:-1]
ros_package_deps.append(ros_package_dep)
return ros_package_deps
Run Code Online (Sandbox Code Playgroud)
问题是我得到了
[rospack]错误:没有给出包
并且返回值始终是一个空列表。我什至尝试将ros_package参数连接到命令本身,但一切都是徒劳的。
在我徒劳的尝试中,我发现了一些相当奇怪的事情。和实际上list都是depends传递给 的参数rospack。事实上,如果您rospack仅调用,您将收到一条错误消息,告诉您调用rospack help以查看可用的参数。
因此我尝试将这些东西分开并传递["rospack", "list"]给["rospack", "depends", "ros_package"]两个POpen调用。让我惊讶的是我得到了
[rospack] 错误:未给出命令。尝试“rospack 帮助”[rospack]
[rospack] 错误:未给出命令。尝试“rospack帮助”
至少对我来说这是一种相当奇怪的行为。
这是对如何运行 Popen 的困惑。您应该使用以下命令传递单个字符串shell=True:
ros_package_deps_retrieve = subprocess.Popen("rospack depends %s"rospack, shell=True, stdout=subprocess.PIPE)
Run Code Online (Sandbox Code Playgroud)
或将其作为完全独立的列表传递,并使用shell=False(默认值,无需指定):
ros_package_deps_retrieve = subprocess.Popen(["rospack", "depends", rospack], stdout=subprocess.PIPE)
Run Code Online (Sandbox Code Playgroud)
请参阅此处的文档: https ://docs.python.org/2/library/subprocess.html#popen-constructor
重要部分(以下是文档中的相关引用):
如果 shell 为 True,建议将 args 作为字符串而不是序列传递。...
如果 args 是一个序列,则第一项指定命令字符串,任何其他项将被视为 shell 本身的附加参数。
因此,当您shell=True像这样传递并传递它时['rospack', 'list'],rospack最终会成为命令,并成为shell 的list参数,而不是您想要的。
当shell=False您像 一样传递它时['rospack depends', rosmodule],会使该字符串成为'rospack depends'要运行的命令,该命令不存在,因此会失败。
| 归档时间: |
|
| 查看次数: |
1836 次 |
| 最近记录: |