2013-05-27 1 views
1

위의 Popen 전화에서 stdout=PIPE을 제거하면 모든 목록을 출력 한 후 ls -l 출력이 나옵니다. stdout=PIPE를 사용하는 경우, 나는이 \nPIPE 정확히 subprocess.Popen의 경우에 작동 않는 방법subprocess.Popen에서 stdout = PIPE를 사용해야하는 이유는 무엇입니까?

b'total 67092\n-rw-r--r-- 1 root root  171 May 27 09:08 new.py\n-rw-r--r-- 1 
    root root  74 May 12 18:14 abcd.conf\n-rwxr-xr-x 1 root root  5948 May 13 13:21 abxyz.sh\ndrwxr-xr-x 2 root root  4096 May 13 
12:39 log\ndrwxrwxrwx 3 root root  4096 May 14 16:02 
newpy\n-rw-r--r-- 1 root root  134 May 27 10:13 
pipe.py\n-rw-r--r-- 1 root root  155 May 27 10:07 
proc.py\ndrwxrwxrwx 3 root root  4096 May 14 14:29 py\ndrwxr-xr-x 
16 1000 1000\n' b'' 

아래로, 오히려 개행보다, 표시 얻을? 왜 우리는 그것을 필요로합니까? 나는 그것을 사용하지 않고도 적절한 출력을 얻었습니까? stderr와 stdout을 모두 사용하고 있습니까?

답변

3

print() 전화를 제거하여 차이점을 확인하십시오.

ls 출력을 파이썬으로 파이프하지 않으면, 직접 터미널에 표시됩니다. 출력이 터미널로 전달됩니다. 파이썬으로 파이핑하면 개행 문자 (\n으로 표시)를 포함하여 전체 내용을 바이트로 볼 수 있습니다.

디코드에게 그 결과는 당신이 뉴 라인 그대로를 인쇄 할 경우 :

print(out.decode('utf8')) 
+0

오을. 나는 그것을 인쇄하지 않고 보았다. 그것은 내 화면에 직접 표시됩니다. 나는 그것을 인쇄하고 있다고 생각했다. PIPE가없는'stdin'의 경우 어떻게 사용합니까? –

+0

'stdout = PIPE'을 사용한 후에도 화면에 stderr를 표시하지 않습니다. 왜? stdout을 파이프하고 stderr 만 표시하면 안됩니다. –

+0

'ls'은'stdout' 파일 핸들에 글을 씁니다.이 파일 핸들은 파이프가 터미널에 직접 연결되어 있지 않을 때 쓰게됩니다. 파이프를 파이썬으로 파이프하면'ls'이 쓰는 모든 것을 캡처 할 수 있습니다. 'ls'는'stderr'에 아무것도 쓰지 않습니다. 'stderr'에'PIPE'을 사용하면'err' 변수가 비어있는 것을 볼 수 있습니다 ('b'''는 빈 바이트 값입니다). –

관련 문제