programing

Python 하위 프로세스 와일드 카드 사용

nasanasas 2020. 12. 15. 19:23
반응형

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

반응형