无法将参数传递给具有POpen的子进程

2024-07-03 06:15:33 发布

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

我目前正在研究为ROS(机器人操作系统)创建一个通用配置工具。使用subprocess.POpen()Tkinter我创建了一个treeview,如下所示:

enter image description here

由于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内的每个包,我调用以下函数:

^{pr2}$

问题是我

[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'

至少对我来说,这是一种相当奇怪的行为。在


Tags: installedno命令package参数packageshelpros
1条回答
网友
1楼 · 发布于 2024-07-03 06:15:33

这与如何管理Popen有点混乱。您应该传递一个带有shell=True的字符串:

 ros_package_deps_retrieve = subprocess.Popen("rospack depends %s"rospack, shell=True, stdout=subprocess.PIPE)

或者将其作为完全独立的列表传递,并使用shell=False(默认值,不需要指定):

^{pr2}$

请参阅此处的文档: https://docs.python.org/2/library/subprocess.html#popen-constructor

重要部分(以下是文件中的相关引用):

If shell is True, it is recommended to pass args as a string rather than as a sequence. ...

If args is a sequence, the first item specifies the command string, and any additional items will be treated as additional arguments to the shell itself.

因此,当您传递shell=True并像['rospack', 'list']一样传递它,rospack最终成为命令,list成为shell的参数,而不是您想要的。在

shell=False并且像['rospack depends', rosmodule]一样传递它时,字符串'rospack depends'是要运行的命令,它不存在,因此失败。在

相关问题 更多 >