【问题标题】:Python subprocess update child-processPython子进程更新子进程
【发布时间】:2014-09-19 04:40:06
【问题描述】:

是否可以更新通过Popen([cmd], stdin=PIPE) 产生的子进程的一部分?

我一直在尝试构建一个与 GUI 交互以更新文件的脚本。 这是我一直在玩的东西:

def __init__(self):
    #... <SNIPPED>
    process = self.outer._display(self.custom['dialog_name'], _passed, return_process=True)
    # Returns executed list, example -> ['/bin/foo', '--bar', '0', '--lyn', 'twenty']
    self.pipe = subprocess.Popen(process, stdin=subprocess.PIPE)

管道建在我班的__init__。我希望能够运行以下函数来更新进程。

def update(self, bar, lyn):
    self.pipe.communicate('--bar {} --lyn {}\n'.format(bin, lyn))

在初始化包含管道的类后运行更新函数后,子进程没有更新。我对 Python 还是很陌生,所以如果我以错误的方式处理这个问题,我不会感到惊讶。

如果您可以帮助解释我做错了什么或更好地解决此问题,请告诉我。

【问题讨论】:

  • 您是要更新命令行还是传递正在运行的程序知道如何阅读的消息?前者无法完成AFAIK。
  • 我猜我确实想要更新当前命令的参数。我已经能够通过os.popen 实现我想要的,但我宁愿使用首选(子流程)
  • 如前所述,您无法更新其命令行。被调用的程序必须编写以接收和处理更新,例如通过标准输入,这似乎是您的代码所期望的。分享您的os.Popen 版本并说明结果有何不同,或说明被调用程序希望如何接收更新。

标签: python subprocess pipe popen child-process


【解决方案1】:

我已经能够通过 os.popen 实现我想要的,但我宁愿使用首选(子进程)

每个os.popen() 都会启动一个新的shell 进程。 self.pipe.communicate() 不会启动新进程:它写入 all 输入,读取 all 输出,然后等待进程完成。

使用一组新参数启动命令:

def update(self, bar, lyn):
    cmd = ['/bin/foo', '--bar', bar, '--lyn', lyn]
    self.processes.append(subprocess.Popen(cmd))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-07
    • 1970-01-01
    相关资源
    最近更新 更多