[PYTHON] 파이썬 하위 프로세스 와일드 카드 사용법
PYTHON파이썬 하위 프로세스 와일드 카드 사용법
import os
import subprocess
proc = subprocess.Popen(['ls','*.bc'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out,err = proc.communicate()
print out
이 스크립트는 모든 파일을 .bc 접미어로 인쇄해야하지만 빈 목록을 반환합니다. 명령 줄에서 ls * .bc를 수동으로 수행하면 작동합니다. 스크립트 안의 [ 'ls', 'test.bc']는 잘 작동하지만 별 기호가 작동하지 않습니다. 어떤 아이디어가 있습니까?
해결법
-
==============================
1.쉘 인터프리터를 통해 명령을 실행하려면 shell = True를 제공해야합니다. 그러나 그렇게하면 인수가 인용 될 것이므로 더 이상 첫 번째 인수로 목록을 제공 할 수 없습니다. 대신 쉘로 전달할 원시 명령 줄을 지정하십시오.
쉘 인터프리터를 통해 명령을 실행하려면 shell = True를 제공해야합니다. 그러나 그렇게하면 인수가 인용 될 것이므로 더 이상 첫 번째 인수로 목록을 제공 할 수 없습니다. 대신 쉘로 전달할 원시 명령 줄을 지정하십시오.
proc = subprocess.Popen('ls *.bc', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
-
==============================
2.* glob를 확장하는 것은 쉘의 일부이지만 기본적으로 하위 프로세스는 쉘을 통해 명령을 보내지 않으므로 명령 (첫 번째 인수, ls)이 실행되고 리터럴 *이 인수로 사용됩니다.
* glob를 확장하는 것은 쉘의 일부이지만 기본적으로 하위 프로세스는 쉘을 통해 명령을 보내지 않으므로 명령 (첫 번째 인수, ls)이 실행되고 리터럴 *이 인수로 사용됩니다.
이것은 좋은 일입니다. 서브 프로세스 문서의 "자주 사용되는 인수"섹션의 경고 블록을 참조하십시오. 주로 보안 함의에 대해 설명하지만 바보 같은 프로그래밍 오류는 피할 수 있습니다 (마술 셸 문자가 걱정되지 않으므로)
shell = True에 대한 나의 주요 불만은 대개 문제에 관해 더 좋은 방법이 있음을 의미합니다. 예를 들어, glob 모듈을 사용해야합니다 :
import glob files = glob.glob("*.bc") print files # ['file1.bc', 'file2.bc']
이것은 더 빠르며 (프로세스 시작 오버 헤드 없음),보다 안정적이며 크로스 플랫폼 (ls 명령을 갖는 플랫폼에 의존하지 않음)
from https://stackoverflow.com/questions/9997048/python-subprocess-wildcard-usage by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 파이썬을 사용하여 문자열에서 URL을 추출하는 가장 깨끗한 방법은 무엇입니까? (0) | 2018.10.08 |
---|---|
[PYTHON] 파이썬 범위 [duplicate] (0) | 2018.10.08 |
[PYTHON] 판다에서 datetime 형식을 변경하는 방법 (0) | 2018.10.08 |
[PYTHON] Pandas : 필요한 경우 NaN을 생성하여 숫자로 변환 (0) | 2018.10.08 |
[PYTHON] 파이썬에서 os.system ()의 반환 값은 무엇입니까? (0) | 2018.10.08 |