복붙노트

[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. ==============================

    1.쉘 인터프리터를 통해 명령을 실행하려면 shell = True를 제공해야합니다. 그러나 그렇게하면 인수가 인용 될 것이므로 더 이상 첫 번째 인수로 목록을 제공 할 수 없습니다. 대신 쉘로 전달할 원시 명령 줄을 지정하십시오.

    쉘 인터프리터를 통해 명령을 실행하려면 shell = True를 제공해야합니다. 그러나 그렇게하면 인수가 인용 될 것이므로 더 이상 첫 번째 인수로 목록을 제공 할 수 없습니다. 대신 쉘로 전달할 원시 명령 줄을 지정하십시오.

     proc = subprocess.Popen('ls *.bc', shell=True,
                                        stdout=subprocess.PIPE,
                                        stderr=subprocess.PIPE)
    
  2. ==============================

    2.* glob를 확장하는 것은 쉘의 일부이지만 기본적으로 하위 프로세스는 쉘을 통해 명령을 보내지 않으므로 명령 (첫 번째 인수, ls)이 실행되고 리터럴 *이 인수로 사용됩니다.

    * glob를 확장하는 것은 쉘의 일부이지만 기본적으로 하위 프로세스는 쉘을 통해 명령을 보내지 않으므로 명령 (첫 번째 인수, ls)이 실행되고 리터럴 *이 인수로 사용됩니다.

    이것은 좋은 일입니다. 서브 프로세스 문서의 "자주 사용되는 인수"섹션의 경고 블록을 참조하십시오. 주로 보안 함의에 대해 설명하지만 바보 같은 프로그래밍 오류는 피할 수 있습니다 (마술 셸 문자가 걱정되지 않으므로)

    shell = True에 대한 나의 주요 불만은 대개 문제에 관해 더 좋은 방법이 있음을 의미합니다. 예를 들어, glob 모듈을 사용해야합니다 :

    import glob
    files = glob.glob("*.bc")
    print files # ['file1.bc', 'file2.bc']
    

    이것은 더 빠르며 (프로세스 시작 오버 헤드 없음),보다 안정적이며 크로스 플랫폼 (ls 명령을 갖는 플랫폼에 의존하지 않음)

  3. from https://stackoverflow.com/questions/9997048/python-subprocess-wildcard-usage by cc-by-sa and MIT license