重用子进程对象

时间:2012-06-22 22:50:00

标签: python shell subprocess

我有一个需要发出许多shell命令的Python脚本。我以为我可以创建一个子进程对象,然后在每次执行命令时重用它。

这就是我设置代码的方式:

def setupPipeline(self):
    setupShell = subprocess.Popen([''], stdout=subprocess.PIPE, shell=True, stderr=subprocess.PIPE, stdin=subprocess.PIPE)

    # Stop running pipeline
    setupShell.stdin.write('stop ' + self.Name)
    output = setupShell.stdout.read()
    print output

    # Cancel any running jobs and cleanup variables
    setupShell.stdin.write('sudo -u pr cancel ALL')
    output = setupShell.stdout.read()
    print output

    setupShell.stdin.write('sudo -u pr clean ALL')
    output = setupShell.stdout.read()
    print output

(在这里跳过很多其他代码)

if __name__ == '__main__':
#self-test code
pipelineObj = Pipeline(sys.argv)
pipelineObj.setupPipeline()

然而,当代码到达第二个命令时,我得到了一个

IOError: [Errno 32] Broken pipe

如何重用子进程对象来发出需要在同一个shell中执行的命令?这些命令不能简单地链接在一起,因为每次调用之间都会进行处理。

1 个答案:

答案 0 :(得分:4)

创建一个执行shell的子进程,并向其发送命令。您在 shell中运行了一个空命令,这导致它执行该空命令然后退出。

shell = subprocess.Popen("/bin/bash -i".split(), stdin=subprocess.PIPE,
                         stdout=subprocess.PIPE, stderr=subprocess.PIPE)

您可以考虑使用pexpect,因为听起来您正在重新发明它......