2011-03-30 4 views
3

subprocess.check_call()을 호출하면 stdout에 대한 파일 객체를 지정할 수 있지만 데이터를 파일에 기록하기 전에 해당 파일을 행 단위로 수정하고 싶습니다. check_call 완료 후stdout을 subprocess.check_call에서 함수로 리디렉션 하시겠습니까?

나는 현재 tempfile.TemporaryFile()에 의해 만들어진 임시 파일 (출력을 리디렉션합니다. 저는 임시 파일의 줄 단위는 최종 출력 파일을 수정을 쓰기 읽어 보시기 바랍니다.

를 출력하기 때문에 메모리 솔루션에-가능하지 않습니다 나는 즉석에서 데이터를 수정하고 직접 최종 출력 파일에 기록하고 싶은, 큰 순수한입니다.

사람이 그것을 달성하는 방법을 알고 있나요?

답변

2
def check_call_modify(command, modifier_function, output_file) 
    p = subprocess.Popen(command, stdout=subprocess.PIPE) 
    for line in p.stdout: 
     line = modifier_function(line) 
     output_file.write(line)  
    p.wait() 
    if p.returncode: 
     raise subprocess.CalledProcessError(p.returncode, command) 
    return p.returncode 

은 각 행과 파일을 수정하는 함수를 전달하는 데 사용합니다.

with open('listupper.txt', 'w') as f: 
    check_call_modify(['ls', '-l'], operator.methodcaller('upper'), f) 
-1

파이썬은 오리 입력, 그래서 당신은 항상 check_call에 전달하기 전에 파일 객체를 래핑 수 : 벙어리 아래 예는 listupper.txt에 대문자로 ls -l의 결과를 저장합니다.

이 답변의 예는 doing it for write()입니다. 철저히 말하면 writelines()을 감쌀 수도 있습니다.

+0

-1 : 아니요. 서브 프로세스가'.fileno()'메소드를 가진 객체를 필요로하고, 반환 된 파일 설명자에 직접 씁니다. 사실, 파일 기술자는 서브 프로세스에 직접 전달되기 때문에 파이썬은 작성에 관여하지 않습니다. – nosklo

+0

이상한 필자는 .fileno()없이 파일과 유사한 객체를 전달할 수 있다는 것을 기억했다. 오 잘. 내 실수 야. – ssokolow

관련 문제