我尝试过下面的类,在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)
任何人都知道什么是错的? 我感谢
答案 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工作永远悬空,需要手动杀死。这当然是我们现在不想要的