我目前正在研究为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)
由于调用rospack depends <package>
(列出<package>
所需的所有包,以便生成和/或运行)时,Requires列是一个棘手的列。对于ros_packages_installed
内的每个包,我调用以下函数:
问题是我
[rospack] Error: no package given
返回值总是一个空列表。我甚至尝试将ros_package
参数连接到命令本身,但都没有成功。在
在我徒劳的尝试中,我发现了一些相当奇怪的东西。list
和{rospack
的参数。事实上,如果只调用rospack
,则会出现一个错误,告诉您调用rospack help
来查看可用的参数。在
因此,我尝试将这些东西分开,并将["rospack", "list"]
和{POpen
调用。让我吃惊的是
[rospack] Error: no command given. Try 'rospack help' [rospack]
[rospack] Error: no command given. Try 'rospack help'
至少对我来说,这是一种相当奇怪的行为。在
这与如何管理Popen有点混乱。您应该传递一个带有
shell=True
的字符串:或者将其作为完全独立的列表传递,并使用
^{pr2}$shell=False
(默认值,不需要指定):请参阅此处的文档: https://docs.python.org/2/library/subprocess.html#popen-constructor
重要部分(以下是文件中的相关引用):
因此,当您传递
shell=True
并像['rospack', 'list']
一样传递它,rospack
最终成为命令,list
成为shell的参数,而不是您想要的。在当
shell=False
并且像['rospack depends', rosmodule]
一样传递它时,字符串'rospack depends'
是要运行的命令,它不存在,因此失败。在相关问题 更多 >
编程相关推荐