2010-04-28 3 views
6

나는 명령 행에서 stdin을 읽는 도구를 가지고있다. gziped 파일로 나도 실행됩니다 명령 행에서 ...Python에서 Popen으로 열린 gzip 파일을 사용할 수 있습니까?

./foo < bar 

또는 ...

cat bar | ./foo 

나는 내가 할 수있는 파이썬에서

zcat bar.gz | ./foo 

를 실행할 수 있습니다. ..

Popen(["./foo", ], stdin=open('bar'), stdout=PIPE, stderr=PIPE) 

하지만 내가 바람

import gzip 
Popen(["./foo", ], stdin=gzip.open('bar'), stdout=PIPE, stderr=PIPE) 

p0 = Popen(["zcat", "bar"], stdout=PIPE, stderr=PIPE) 
Popen(["./foo", ], stdin=p0.stdout, stdout=PIPE, stderr=PIPE) 

내가 뭔가 잘못하고 있는가 실행하지 할 수 없어? Popen에 대한 표준 arg로 gzip.open ('bar')을 사용할 수없는 이유는 무엇입니까?

답변

4

하위 프로세스의 'stdin'및 'stdout'은 운영 체제 리소스 인 파일 설명 자 (숫자)를 사용하기 때문에. 이것은 객체를 전달할 때 서브 프로세스 모듈이 객체가 'fileno'속성을 가지고 있는지 검사하고, 그것이 있다면, 그것을 사용할 것입니다.

'gzip'개체는 운영 체제가 제공하는 것이 아닙니다. 열린 파일은 소켓이고, 파이프는 있습니다. Gzip 객체는 read() 및 write() 메서드를 제공하지만 fileno 속성은 제공하지 않는 객체입니다.

하위 프로세스의 communicate() 메소드를 사용할 수 있지만 사용하고 싶을 수도 있습니다.

+0

예, 실제로 p = Popen ([...])을 사용하고 p.communicate() [0]을 읽었습니다. 또한 내 프로그램은 foo라고하지 않으며 입력 파일은 bar라고하지 않습니다 .-) 쉬운 수정이 없다고 말하는 것입니까? Popen ([ "./foo",], stdin = gzip.open ('bar'), stdout = PIPE, stderr = PIPE)이 이상한 것을 알았습니다. 예외. 그것이 fileno 속성을 가지고 있지 않더라도 그것으로 무언가를하고 있습니다. –

+0

서브 프로세스 모듈의 'PIPE'및 'STDOUT'속성은 '특수 상수'입니다. stderr = STDOUT 인 경우 상수는 클라이언트 프로세스로 전달되어야하는 fileno가 동일해야하며 stdout으로 전달되어야 함을 나타냅니다. PIPE의 경우 운영 체제 'pipe()'명령을 사용하여 새 파일을 만듭니다. 파이프의 절반 (실제로 2 개의 숫자)이 클라이언트 프로세스에 전달되고 사용자에게 하나가 전달됩니다. 한 부분에 쓰여지는 내용은 모두 다른 부분에서 읽을 수 있습니다. 쉬운 방법으로 고칠 수 없으면 더 많은 프로그래밍이 필요할 것입니다. – ondra

관련 문제