Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 无法将参数传递给具有POpen的子流程_Python_Arguments_Subprocess_Popen_Ros - Fatal编程技术网

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

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

我目前正在考虑为ROS(机器人操作系统)创建一个通用配置工具。使用
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)