아래 클래스로 시도해 보았습니다. python2.6에서 subporcess 모듈로 차례대로 명령을 실행했습니다. 에 ValueError : 나는 다음과 같은 코드를하려고하면Python - 닫힌 파일에 대한 서브 프로세스 I/O 작업
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)
그러나, 나는 오류가 폐쇄 된 파일에 대한 I/O 작업
from pconsole import BaculaActions
myconsole = BaculaActions()
run = myconsole.run_job("xxxxx-data", "incremental")
delete = myconsole.del_jobid(25487)
사람이 무슨 일을 할 수있는 아이디어를 가지고? 파이프가 닫히고, 첫 번째 명령을 실행하고 결과를 얻을 후
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'프로세스가 가 종료하고, 따라서 오류 : 나는 수동 정말 모든 것을 말해
@isdeve이 방법을 사용하면 실행해야하는 각 명령에 대해 유일한 해결책이 될 것이고, 'mysconsole'을 다시 인스턴스화 할 수 있습니까? Popen은 "방법"을 닫지 않았기 때문에 내가 시작하는 과정이 시스템에서 "잃어버린"것이기 때문에 또 다른 의심이 들지 않습니까? – adinanp
시작하는 프로세스가 손실되지 않고 종료됩니다 (즉, 종료). 그래서 당신은 두 가지 옵션을 가지고 있습니다 : 당신이 보내고 싶은 모든 명령에 대해 'bconsole'을 실행하고'commun'를 사용하십시오 - 가장 안전한 방법입니다. 또는 'bconsole'이 매번 시작될 때 너무 오래 걸리고, 당신이 보낸 각 명령에 의해 많은 출력이 생성된다면 stdin에 직접 명령을 쓰고 stdout/stderr에서 예상되는 행 수를 읽을 수 있습니다. 그러나 교착 상태가 발생하기 쉽고이 경우에 무엇을하는지 알아야합니다. – isedev
@adinanp :'pexpect' 모듈이 터미널에서와 같이 자식 프로세스와 대화식으로 통신하기를 원할 것입니다. [pipe (popen())을 사용하지 않는 이유는 무엇입니까?] (http://pexpect.readthedocs.org/en/latest/FAQ.html#whynotpipe) – jfs