Python 无法将参数传递给具有POpen的子流程
我目前正在考虑为ROS(机器人操作系统)创建一个通用配置工具。使用Python 无法将参数传递给具有POpen的子流程,python,arguments,subprocess,popen,ros,Python,Arguments,Subprocess,Popen,Ros,我目前正在考虑为ROS(机器人操作系统)创建一个通用配置工具。使用subprocess.POpen()和Tkinter我正在创建一个treeview如下: 前两列的创建非常简单,因为它采用了简洁的方式rospack list(该命令列出了系统上安装的所有软件包,包括开发人员创建自己软件包的相应工作区内的软件包): Requires列是一个棘手的列,因为调用rospack dependens时出现问题(列出了为构建和/或运行需要在系统上出现的所有包(如果有)。对于安装在ros\u package
subprocess.POpen()
和Tkinter
我正在创建一个treeview
如下:
前两列的创建非常简单,因为它采用了简洁的方式rospack list
(该命令列出了系统上安装的所有软件包,包括开发人员创建自己软件包的相应工作区内的软件包):
Requires列是一个棘手的列,因为调用rospack dependens
时出现问题(列出了
为构建和/或运行需要在系统上出现的所有包(如果有)。对于安装在ros\u packages\u中的每个软件包
I调用以下函数:
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
问题是我越来越
[rospack]错误:未提供任何包
返回值总是一个空列表。我甚至尝试将ros\u包
参数连接到命令本身,但都没有成功
在我徒劳的尝试中,我发现了一些相当奇怪的东西。list
和dependens
实际上都是传递给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)
或者将其作为一个完全独立的列表传递,并使用shell=False
(默认值,无需指定):
请参阅此处的文档:
重要部分(以下是文件中的相关引用):
如果shell为True,建议将args作为字符串传递,而不是
而不是作为一个序列
如果args是序列,则第一项
指定命令字符串,并将处理任何其他项
作为shell本身的附加参数
因此,当您传递shell=True
并像传递['rospack',list']
一样传递它时,rospack
最终成为命令,list
成为shell的参数,而不是您想要的参数
当
shell=False
并像['rospack dependens',rosmodule]
那样传递它时,这使得字符串'rospack dependens'
成为要运行的命令,该命令不存在,因此失败。这与如何运行Popen是一个混淆。您可以通过shell=True
传递单个字符串:
ros_package_deps_retrieve = subprocess.Popen("rospack depends %s"rospack, shell=True, stdout=subprocess.PIPE)
或者将其作为一个完全独立的列表传递,并使用shell=False
(默认值,无需指定):
请参阅此处的文档:
重要部分(以下是文件中的相关引用):
如果shell为True,建议将args作为字符串传递,而不是
而不是作为一个序列
如果args是序列,则第一项
指定命令字符串,并将处理任何其他项
作为shell本身的附加参数
因此,当您传递shell=True
并像传递['rospack',list']
一样传递它时,rospack
最终成为命令,list
成为shell的参数,而不是您想要的参数
当shell=False
并且像['rospack dependens',rosmodule]
一样传递它时,这使得字符串'rospack dependens'
成为要运行的命令,该命令不存在,因此失败
ros_package_deps_retrieve = subprocess.Popen(["rospack", "depends", rospack], stdout=subprocess.PIPE)