2017-10-17 2 views
0

파이썬 스크립트에서 Bash 명령의 결과를 확인하고 싶습니다. subprocess.check_output()을 사용하고 있습니다. 서브 프로세스가 빈 문자열을 반환합니다.

그 전에, 나는 쉘에서 수동으로이 명령의 결과를 확인 :

[email protected]:~$ hostname 
> something 

[email protected]:~$ command -v apt 
> /usr/bin/apt 

이 그것은 기대 작품으로. 지금은 파이썬 인터프리터에서 subprocess.check_output() 기능을 실행하려고 해요 : 당신이 볼 수 있듯이 (이 빈 문자열을 반환으로), 첫 번째 명령은 두 번째 예상대로 작동되지 않지만,

>>> import subprocess 
>>> subprocess.check_output(['hostname'], shell=True, stderr=subprocess.STDOUT) 
b'something\n' 
>>> subprocess.check_output(['command', '-v', 'apt'], shell=True, stderr=subprocess.STDOUT) 
b'' 

. 왜 그런가요? 매개 변수에서

>>> subprocess.check_output(['command', '-v', 'apt'], stderr=subprocess.STDOUT) 
Traceback (most recent call last): 
[...] 
FileNotFoundError: [Errno 2] No such file or directory: 'command' 
+0

'shell = True'를 제거하면 문제가 해결됩니다. 또한 두 번째 호출 –

+0

대신'shutil.which ('apt')'를 사용할 수 있습니다. 왜 사람들은 기본적으로 shell = True를 설정합니까? –

+0

기본적으로'shell = True'를 설정하지 않았습니다. 오류가 발생했기 때문에 추가했습니다. –

답변

0

드롭 shell=True :

편집 이미 shell=True을 제거하려고

, 그것은 오류를 반환

>>> subprocess.check_output(['command', '-v', 'apt'], stderr=subprocess.STDOUT) 
'/usr/bin/apt\n' 

Actual meaning of 'shell=True' in subprocess를 참조하십시오.

If shell is True , it is recommended to pass args as a string rather than as a sequence.

이것은 당신이 당신의 쉘에서 직접 입력 한 경우 명령이 제대로이처럼 포맷 보장 : 그러나

>>> subprocess.check_output('command -v apt', shell=True, stderr=subprocess.STDOUT) 
'/usr/bin/apt\n' 

, shell는 일반적으로 권장되지 않습니다 사용.

+0

왜 그것이 필요한지 설명 할 수 있습니까? –

+0

나는 이미 그걸 시도했지만 작동하지 않습니다. 내 질문을 업데이트 할게. –

관련 문제