代码之家  ›  专栏  ›  技术社区  ›  rbaleksandar

无法使用POpen将参数传递给子进程

  •  1
  • rbaleksandar  · 技术社区  · 9 年前

    我目前正在研究为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> 需要出现在系统上才能生成和/或运行)。对于内部的每个包 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
    

    问题是我越来越

    返回值总是一个空列表。我甚至尝试连接 ros_package 命令本身的参数,但都是徒劳的。

    在我徒劳的尝试中,我发现了一些相当奇怪的事情。二者都 list depends 实际上是传递给 rospack 只有你会在告诉你打电话时出错 rospack help

    ["rospack", "list"] ["rospack", "depends", "ros_package"] 给两个人 POpen 电话。为了我的惊喜

    [rospack]错误:未发出命令。尝试“rospack帮助”[rospack]

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

    1 回复  |  直到 9 年前
        1
  •  5
  •   Corley Brigman    9 年前

    这是一个如何运行Popen的困惑。您应该用 shell=True :

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

    shell=False

     ros_package_deps_retrieve = subprocess.Popen(["rospack", "depends", rospack], stdout=subprocess.PIPE)
    

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

    而不是序列。。。

    如果args是序列,则第一项 作为shell本身的附加参数。

    所以当你经过的时候 外壳=真 然后像 ['rospack', 'list'] , rospack 最终成为命令 list 成为

    什么时候 然后你像 ['rospack depends', rosmodule] ,这使得字符串 'rospack depends'