2014-09-09 2 views
1

아래 클래스로 시도해 보았습니다. 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'프로세스가 종료하고, 따라서 오류 : 나는 수동 정말 모든 것을 말해

답변

5

감사합니다 두 번째는 communicate입니다.

+0

@isdeve이 방법을 사용하면 실행해야하는 각 명령에 대해 유일한 해결책이 될 것이고, 'mysconsole'을 다시 인스턴스화 할 수 있습니까? Popen은 "방법"을 닫지 않았기 때문에 내가 시작하는 과정이 시스템에서 "잃어버린"것이기 때문에 또 다른 의심이 들지 않습니까? – adinanp

+0

시작하는 프로세스가 손실되지 않고 종료됩니다 (즉, 종료). 그래서 당신은 두 가지 옵션을 가지고 있습니다 : 당신이 보내고 싶은 모든 명령에 대해 'bconsole'을 실행하고'commun'를 사용하십시오 - 가장 안전한 방법입니다. 또는 'bconsole'이 매번 시작될 때 너무 오래 걸리고, 당신이 보낸 각 명령에 의해 많은 출력이 생성된다면 stdin에 직접 명령을 쓰고 stdout/stderr에서 예상되는 행 수를 읽을 수 있습니다. 그러나 교착 상태가 발생하기 쉽고이 경우에 무엇을하는지 알아야합니다. – isedev

+2

@adinanp :'pexpect' 모듈이 터미널에서와 같이 자식 프로세스와 대화식으로 통신하기를 원할 것입니다. [pipe (popen())을 사용하지 않는 이유는 무엇입니까?] (http://pexpect.readthedocs.org/en/latest/FAQ.html#whynotpipe) – jfs

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) 

나는 방법 "콘솔"나는 시작 내 클래스의 모든 다른 방법을 만들어 : 문제에 대한 해결책으로, 나는 다음과 같은했다.

내 문제가 해결되었습니다.

-1

더 나은 방법은 자원 할당 실패를 처리하기 위해,

하위 프로세스 초기화

이 시도 캐치로 캡슐화되어야하며, 다음과 같이하는 것입니다 주셔서 감사합니다. 그런 다음 성공하면 반환하십시오.

통신하기 전에 채널이 설정되었는지 (오류 없음) 확인한 다음 통신하십시오.

가장 좋은 방법은 의사 소통을 위해 같은 장소에 "Popen"을 유지하는 것입니다. "Popen"을 두 번 복제 할 수 있습니다. 그러나 이것은 안전합니다.

"Popen"과 "communicate"사이에 알 수없는 인터럽트가 있으면 파이썬 작업이 영원히 매달려 수동으로 죽여야합니다. 이것은 우리가 라이브에서 원하지 않는 것입니다.

관련 문제