2012-08-06 9 views
4

서브 프로세스에있는 모든 것을 읽었습니다.하지만 뭔가 빠져 있다고 생각합니다.파이썬에서 외부 명령으로 파이핑 데이터

파이썬 스크립트에서 생성 된 목록에서 데이터 스트림을 읽고 해당 프로그램의 결과를 파일에 쓰는 유닉스 프로그램을 실행할 수 있어야합니다. bash 프롬프트에서 나는이 모든 일을 아무런 문제없이 해왔지만 지금은이 단계에 오기 전에 일부 바이너리 파일과 많은 데이터를 미리 처리하는 파이썬 스크립트 내에서 이것을 시도하고있다.

import sys 
from pylab import * 
from subprocess import * 
from shlex import split 

# some arbitrary x,y points 
points = [(11,31),(13,33),(15,37),(16,35),(17,38),(18,39.55)] 

commandline = 'my_unix_prog option1 option2 .... > outfile' 
command = split(commandline) 

process = Popen(command, stdin=PIPE, stdout=PIPE, stderr=PIPE) 
print process.communicate(str(points)) 

이것은 떠들썩한 파티에서 실행되는 것 인 방법이다 :

echo "11 31 
     13 33 
     15 37 
     16 35 
     17 38 
     18 39.55" | my_unix_prog option1 option2 .... > outfile 

방법 데이터는 유닉스 음식물로 공급된다

모든 전처리를 포함하지 않는 단순한 예를 살펴하자 또한 중요하다. 공백으로 구분 된 두 개의 열로 형식을 지정해야한다.

+0

'명령 '에서 출력을'outfile'으로 리디렉션했지만'communicate'를 사용하여 프로그램으로 읽으려고합니다. 출력물을 어디로 보내시겠습니까? –

+1

'>'를 사용하면 출력을 파일로 리디렉션 할 수 없습니다.이 답변을 참조하십시오 : http://stackoverflow.com/questions/8902206/subprocess-popenio-redirect – Dhara

답변

3

해결! Dharaxhainingx의 도움으로

나는이 알아낼 수 있었다 :

import sys 
from pylab import * 
from subprocess import * 
from shlex import split 

# some arbitrary x,y points 
points = [(11,31),(13,33),(15,37),(16,35),(17,38),(18,39.55)] 

commandline = 'my_unix_prog option1 option2 ....' 
command = split(commandline) 

process = Popen(command, stdin=PIPE, stdout=open('outfile', 'w'), stderr=PIPE) 
for p in points: 
    process.stdin.write(str(p[0]) + ' ' + str(p[1]) + '\n') 

print process.communicate() 

이는 아주 잘 감사 작동합니다.

+0

당신과 당신의 하위 프로세스가 그걸로 끝났을 때 당신이 나중에'.close()'를 호출 할 수 있도록 Popen 호출 밖에서 파일 객체를 생성 할 것을 권한다. –

1

어떤 도움이 감사는 ... 어떻게

for p in points: 
    process.stdin.write(str(p[0]) + ' ' + str(p[1]) + '\n') 

print process.communicate() 
+0

네, 맞습니다 당신)하지만 내 문제가 전에 시작한다고 생각 : 나는 '>'리다이렉션을 사용하지만 이것은 쉘 리디렉션이며 유효하지 않습니다. – Shahar

+0

@Shahar 포탄 생성자에서'shell = True' 인수를 사용하여 쉘 리다이렉션을 허용 할 수 있습니다. 그러나'communicate'는 stdout에 대해 아무것도 반환하지 않습니다. 또 다른 옵션은'f = open ('outfile', 'w')'파일을 열고'PIPE' 대신'stdout = f'를 사용하는 것입니다. 난 지금 무슨 문제인지 잘 모르겠다. –

0

같은 대해 올바르게 통신 할 수 귀하의 의견을 포맷해야합니다.

str은 원하는 것이 아닌 튜플 목록을 인쇄 할 때 특수 문자를 유지합니다.

>>> print str([(1,2), (3,4)]) 
[(1,2), (3,4)] 

이 시도 :

print process.communicate("\n".join(["%s %s"%(x[0], x[1]) for x in points])