2013-04-09 5 views
0

저는 서브 프로세스를 시작하고 서브 프로세스 stdin에 쓰는 파이썬 스크립트를 작성하려고합니다. 출력에 대한 일부 테스트를 수행하고 stdin에 더 많은 명령을 씁니다.stdin에 쓰기, 액세스가 거부되었습니다.

나는 시도했다 :

def get_band(): 
    print "band" 
    p = subprocess.Popen(["/path/to/program","-c","-"], stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE) 

    ran_stdout = p.communicate(input='show status')[0] 
    print(ran_stdout) 

인쇄 문을 준다 그러나 :

Unable to connect at 127.0.0.1, Connection refused. 

내가이 권리를하고있는 중이 야 경우 궁금 해서요? 다음은 실행하려는 프로세스에 대한 설명서입니다. 마지막 옵션을 사용하고 싶습니다.

Running the tool from the Linux shell allows additional options, depending on the options given to the command. The options are as follows: 

-h Displays help about the command 

-c <Filename> Instead of taking typed commands interactively from a user the commands are read from the named file, i.e. in batch mode. When all commands are processed the CLI session ends automatically. 

-c - As above but reads command from Linux stdin. This allows commands to be ‘piped’ to the program. 
+3

메시지가 하위 프로세스에서 생성 될 수 있습니까? – Bogdacutu

+0

네, 고맙습니다. 왜 그런지, 허가를 얻는 방법이 궁금합니다. 이러한 매개 변수를 사용하여 터미널에서 프로세스를 실행하면 정상적으로 실행됩니다. – Paul

답변

1

이 프로그램에 대해 더 자세히 알려면이 프로그램을 아는 사람이 그 프로그램의 작동 원리를 더 잘 설명 할 수 있습니다.

그럼에도 불구하고, 당신은

가 서브 프로세스를 시작하고, 서브 프로세스의 표준 입력에 쓰는 것을 설명합니다. 출력에 대한 일부 테스트를 수행하고 stdin에 더 많은 명령을 씁니다.

은 (는) 코드와 일치하지 않습니다.

코드는 band을 표시하는 우리 자신의 stdout에 내용을 인쇄 한 다음 하위 프로세스와 "원샷"통신을 수행합니다.

분명히 말해서 p.communicate()은 서브 프로세스에 도착한 모든 정보를 기록하고 stdin을 닫은 다음 stdout 및 stderr에서 가져온 내용을 모두 읽습니다.

따라서 원하는 내용과 호환되지 않습니다. 쓰기, 읽기, 다시 쓰기.

그래서 직접 작성해야합니다.

작성하는 청크가 파이프 버퍼에 맞도록 충분히 작 으면 간단합니다. 단지 명령을 작성하고 (트레일 \n을 잊지 마세요) 읽고 읽으십시오.

알아 두십시오! 당신이 가진 것보다 더 많이 읽지 마십시오. 그렇지 않으면 당신의 독서가 차단 될 것입니다.

따라서 비 차단 IO 또는 select.select()으로 작업하십시오.

이 중 하나에 대한 추가 정보가 필요하면 다른 주제에 대한 답변이 여기에 있습니다. 다른 날에 나는 one which might help you이라고 썼다.

+0

아래 내 솔루션은 매우 간단하다고 생각하십시오. – Paul

0

이것은 같은 이유로 명령을 전달하는 몇 가지 이유에서 작동합니다. 그런 다음 원하는 모든 명령에 대해이 함수를 호출하십시오.

p = subprocess.Popen(["/path/to/program", '-c', '-', cmd_here], 
    stdout=subprocess.PIPE) 
    proc_stdout, proc_stderr = proc.communicate() 
    proc.wait() 
    #print stuff 
+0

cmdline에 cmd를 주면'-c ','-''를 생략 할 수도 있습니다. 호출 된 프로그램에 따라 다릅니다. 그 외에도 발행 된 모든 명령에 대해 별도의 하위 프로세스를 가지고 있다면이 방법이 가장 간단한 방법 일 것입니다. – glglgl

+0

괜찮아요, 여전히 당신의 훌륭한 대답을 받아들입니다. :) 그래, 이제는 출력이 10 분이 걸리는 것처럼 백그라운드에서 실행할 필요가 있습니다. – Paul

관련 문제