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']를 수행하는 것도 작동하지만 어떤 이유로 별 기호가 작동하지 않습니다 .. 어떤 아이디어가 있습니까?
shell=True
쉘 인터프리터를 통해 명령을 실행하려면 제공해야합니다 . 그러나 그렇게하면 인수가 인용되기 때문에 더 이상 첫 번째 인수로 목록을 제공 할 수 없습니다. 대신 셸에 전달할 원시 명령 줄을 지정합니다.
proc = subprocess.Popen('ls *.bc', shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
확장 *
글로브 것은 쉘의 일부이지만, 기본적으로 subprocess
않습니다 하지 명령 (첫 번째 인수는, 그래서, 쉘을 통해 명령을 보낼 수 ls
) 실행, 다음 문자가 *
인수로 사용됩니다.
이것은 좋은 것 입니다. 하위 프로세스 문서 의 "Frequently Used Arguments"섹션에있는 경고 블록을 참조하십시오 . 주로 보안 관련 사항에 대해 설명하지만 어리석은 프로그래밍 오류를 방지하는데도 도움이 될 수 있습니다 (걱정할 매직 쉘 문자가 없기 때문에)
내 주요 불만 shell=True
은 일반적으로 문제를 해결하는 더 좋은 방법이 있음을 의미합니다. 예제에서는 모듈을 사용해야 합니다glob
.
import glob
files = glob.glob("*.bc")
print files # ['file1.bc', 'file2.bc']
이것은 더 빠르며 (프로세스 시작 오버 헤드 없음), 더 안정적이고 교차 플랫폼 ( ls
명령이 있는 플랫폼에 의존하지 않음 )
참조 URL : https://stackoverflow.com/questions/9997048/python-subprocess-wildcard-usage
'programing' 카테고리의 다른 글
Javascript 배열의 값 테스트 (0) | 2020.12.15 |
---|---|
Mac에서 Eclipse -clean을 실행하는 방법은 무엇입니까? (0) | 2020.12.15 |
Xcode에서 독립적 인 런타임 설정 세트를 구성하는 방법 (0) | 2020.12.15 |
프로그래밍 방식으로 SwipeRefreshLayout 트리거 (0) | 2020.12.14 |
DataTables : 정의되지 않은 'length'속성을 읽을 수 없습니다. (0) | 2020.12.14 |