2014-05-21 3 views
0

현재 열려있는 파일에 subprocess.Popen 객체의 표준 출력을 리디렉션하려고하므로 this과 같은 많은 웹 사이트에있는 지침을 따랐습니다.Python - 열린 파일을 표준 출력으로 Popen에 전달할 수 없습니다.

그러나, Popen.stdout가 제대로

내 코드가 갔다 어떤 이유로 할당되지 않은 다음과

def foo(file): 
    print(file)    # printA 

    proc = subprocess.Popen('command, stdout=file) # i've tried with both shell=True/False 
    print(proc)    # printB 
    print(proc.stdout)  # printC 
    return proc 

def main(): 
    file = open('path', 'w') 
    p = foo(file) 
    print(p.stdout)   # printD 

결과는 어떤에서

printA: <_io.TextIOWrapper name='path' mode='w' encoding='UTF-8'> 
printB: <subprocess.Popen object at 0x161966d0> 
printC: None 
printD: None 

을 다음입니다 I 파이썬 문서 here에서 읽으면, PIPE가 지정되지 않으면 stdout의 기본값은 None입니다. 그러나 this 여기에서 명백하게 우리가 stdout에 대한 인수로 열린 파일을 전달할 수 있음을 보여 주므로 왜 코드가 작동하지 않는지 이해할 수 없습니다.

도와주세요.

+0

printA는 열려있는 것이 표준 파일이 아니라는 것을 명확하게 보여줍니다 (OS 프로세스 디스크립터, 서브 프로세스가 실제로 필요로하는 것). 이 작업을하려면 실제 파일을 전달해야합니다. – deets

+0

@deets U는 .log 또는 .txt 파일과 같은 의미입니까? – user1948847

+0

W : 1,8 : foo : 내장 '파일'다시 정의 W : 10,4 : main : 사용하지 않는 변수 'f' – jhermann

답변

2

나는 간단한 예제를 실행 한 이것은 내가 찾은 것입니다 :

>>> p = subprocess.Popen('ls', stdout=open('moo','w')) 
>>> str(p.stdout) 
'None' 

그러나 파일 '무'는 내 현재 디렉토리의 내용을 가지고있다. @eryksun 사용자의 유용한 힌트 (아래 주석 참조)와 소스 코드를 읽은 후 PIPE가 stdout 매개 변수로 전달되면 p.stdout 변수에 만 할당된다는 것을 알았습니다. 다른 모든 경우에는 None으로 설정되며 이는 위의 예제에서 보여준 것과 정확히 일치합니다. 최종선 - 모든 것이 예상대로 작동합니다.

또한, 어떤 이전의 대답은 제안했다 것이 맞다면 당신은 printA에

<type 'file'> 

를 얻을 것 통지, 그래서 나는 이전의 대답이 올바른지 생각하지 마십시오.

+0

@eryksun - 네 말이 맞아. Popen의 self.stdout은 매개 변수로 PIPE를 전달한 경우에만 설정되지만, 본질적으로 저자가 원하는대로 작업을 요구했기 때문에 많이 바뀌지 않으므로 speek에 "거짓 경보"였습니다. 나는 대답을 업데이트 할 것이다. –

+0

@eryksun - 나는 포인트를 신경 쓰지 않는다. 주변에 많은 사람들이 있는데, 이유를 설명하지 않고 downvoting하는 사람들입니다. 코드 링크를 이용해 주셔서 감사합니다. –

+0

파일을 닫을 때 부작용을 피하기 위해 Open 문을 컨텍스트 관리자로 변경해야합니다. – zmo

2

코드는 아래 수정 몇 가지 결함을 가지고 :

def main(): 
    with open('path', 'w') as f: 
     subprocess.Popen(['command'], stdout=f) 

대신 f 개체, 함수에 대한 매개 변수로 file 객체를 제공하고 있습니다. 그런 다음 함수에서 여러분은 Popen에게주는 글로벌 file 객체를 섀도 잉합니다. 그러나 실제로는 file 객체입니다.

+0

py3에는 더 이상 전역'file' 오브젝트가 없습니다. 그러나 귀하의 SSCCE는 여전히 잘못되었습니다. – zmo

+0

나는 오타라고 생각합니다. 당신은 PrintA –

+0

고맙습니다 !!!에서 다른 출력물을 갖게 될 것입니다, 이것은 실제로 효과가있었습니다. 그러나 추가 질문이 있습니다. x에 popen 개체를 할당하려고 시도했지만 프로그램이 종료되기 전에 프로세스가 종료되었습니다. 그렇게하면 파일이 더 이상 덮어 쓰지 않게됩니다. 파일이 입력과 함께 쓰여진 것이 아니라 버퍼에 저장되어 끝 부분에 파일로 기록되는 것처럼 보입니다. 어떤 생각이 들었습니까? – user1948847