Python - 关闭文件上的子进程I / O操作

时间:2014-09-09 21:46:56

标签: python subprocess

我尝试过下面的类,在python2.6中使用subporcess模块​​按顺序执行命令。

from subprocess import Popen, PIPE

class BaculaActions():

    def __init__(self):
        self.console = Popen(["bconsole"], stdout=PIPE, stderr=PIPE, stdin=PIPE)

    def run_job(self, jobname, level):
        run = self.console.communicate("run job=%s level=%s yes" % (jobname, level))
        return(run)

    def del_jobid(self, jobid):
        delete = self.console.communicate("delete jobid=%s" % (jobid))
        return(delete)

但是,如果我尝试以下代码,我会收到错误: ValueError:关闭文件的I / O操作

from pconsole import BaculaActions

myconsole = BaculaActions()

run = myconsole.run_job("xxxxx-data", "incremental")
delete = myconsole.del_jobid(25487)

任何人都知道什么是错的? 我感谢

3 个答案:

答案 0 :(得分:4)

手册说明了一切:

Popen.communicate(input=None, timeout=None)
Interact with process: Send data to stdin. Read data from stdout and stderr, 
until end-of-file is reached. Wait for process to terminate.

运行第一个命令并获得结果后,'bconsole'进程已终止,管道已关闭,因此第二个communicate调用错误。

答案 1 :(得分:0)

感谢所有以某种方式试图帮助我的人。 作为解决问题的方法,我做了以下几点:

class BaculaActions():

    def console(self):
        return(Popen(["bconsole"], stdout=PIPE, stderr=PIPE, stdin=PIPE))

    def run_job(self, jobname, level):
        run = self.console().communicate("run job=%s level=%s yes" % (jobname, level))
        return(run)

    def del_jobid(self, jobid):
        delete = self.console().communicate("delete jobid=%s" % (jobid))
        return(delete)

    def any_commands(self, command):
        any = self.console().communicate(command)
        return(any)

我创建了一个方法" console"我开始上课的所有其他方法。

这解决了我的问题。

谢谢

答案 2 :(得分:-2)

更好的方法是按照以下方式进行,

任何子进程初始化都必须使用try catch进行封装,以处理资源分配失败。如果成功,则返回。

在沟通之前,检查通道是否已建立(无错误)然后进行通信。

最好的方法是在你通信时将“Popen”放在同一个地方。你最终可能会两次复制“Popen”。但这很安全。

“Popen”和“communication”之间的任何未知中断都会使你的python工作永远悬空,需要手动杀死。这当然是我们现在不想要的