Python Language
하위 프로세스 라이브러리
수색…
통사론
- subprocess.call (args, *, stdin = 없음, stdout = 없음, stderr = 없음, shell = 거짓, timeout = 없음)
- subprocess.Popen (args, bufsize = -1, 실행 가능 = 없음, stdin = 없음, stdout = 없음, stderr = 없음, preexec_fn = 없음, close_fds = 참, shell = 거짓, cwd = 없음, env = 없음, universal_newlines = 거짓 , startupinfo = 없음, 생성 플래그 = 0, restore_signals = True, start_new_session = 거짓, pass_fds = ())
매개 변수
매개 변수 | 세부 |
---|---|
args | 실행 파일과 인수의 단일 실행 파일 또는 시퀀스 - 'ls' , ['ls', '-la'] |
shell | 껍질 아래에서 뛰기? 기본 셸은 POSIX에서 /bin/sh 입니다. |
cwd | 자식 프로세스의 작업 디렉토리. |
외부 명령 호출
가장 간단한 사용 사례는 subprocess.call
함수를 사용하는 경우입니다. 목록을 첫 번째 인수로 사용합니다. 목록의 첫 번째 항목은 호출하려는 외부 응용 프로그램이어야합니다. 목록의 다른 항목은 해당 응용 프로그램에 전달 될 인수입니다.
subprocess.call([r'C:\path\to\app.exe', 'arg1', '--flag', 'arg'])
쉘 명령의 경우, shell=True
설정하고 명령을 목록 대신 문자열로 제공하십시오.
subprocess.call('echo "Hello, world"', shell=True)
위의 두 명령은 하위 프로세스의 exit status
만 반환합니다. 게다가 shell=True
사용할 때 보안 문제가 있으므로주의를 기울여야합니다 ( 여기 참조).
하위 프로세스의 표준 출력을 가져 오려면 subprocess.call
을 subprocess.check_output
대체하십시오. 고급 사용을 위해 참조 이 .
Popen의 유연성 향상
사용 subprocess.Popen
것보다 시작 프로세스를보다 세밀하게 제어 할 줄 subprocess.call
.
하위 프로세스 시작
process = subprocess.Popen([r'C:\path\to\app.exe', 'arg1', '--flag', 'arg'])
Popen
의 서명은 call
함수와 매우 비슷합니다. 그러나 Popen
은 call
이 수행하는 것처럼 하위 프로세스가 완료되기를 기다리는 대신 즉시 반환됩니다.
완료 할 수있는 하위 프로세스 대기 중
process = subprocess.Popen([r'C:\path\to\app.exe', 'arg1', '--flag', 'arg'])
process.wait()
하위 프로세스에서 출력 읽기
process = subprocess.Popen([r'C:\path\to\app.exe'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
# This will block until process completes
stdout, stderr = process.communicate()
print stdout
print stderr
실행중인 하위 프로세스에 대한 대화식 액세스
하위 프로세스가 완료되지 않은 경우에도 stdin
및 stdout
에서 읽고 쓸 수 있습니다. 이 기능은 다른 프로그램에서 기능을 자동화 할 때 유용 할 수 있습니다.
서브 프로세스에 쓰기
process = subprocess.Popen([r'C:\path\to\app.exe'], stdout = subprocess.PIPE, stdin = subprocess.PIPE)
process.stdin.write('line of input\n') # Write input
line = process.stdout.readline() # Read a line from stdout
# Do logic on line read.
그러나 동적 상호 작용보다는 입출력 세트가 하나만 필요한 경우에는 stdin
및 stdout
직접 액세스하는 대신 communicate()
을 사용해야합니다.
하위 프로세스에서 스트림 읽기
서브 프로세스의 출력을 라인 단위로보고 싶다면 다음 스 니펫을 사용할 수 있습니다 :
process = subprocess.Popen(<your_command>, stdout=subprocess.PIPE)
while process.poll() is None:
output_line = process.stdout.readline()
하위 명령 출력에 EOL 문자가없는 경우 위의 스 니펫이 작동하지 않습니다. 그런 다음 출력 문자를 다음과 같이 문자별로 읽을 수 있습니다.
process = subprocess.Popen(<your_command>, stdout=subprocess.PIPE)
while process.poll() is None:
output_line = process.stdout.read(1)
1
받는 인수로 지정된 read
방법은 한 번에 1 문자를 읽고 읽어 알려줍니다. 다른 번호를 사용하여 원하는만큼의 문자를 읽도록 지정할 수 있습니다. 음수 또는 0은 EOF가 발생할 때까지 단일 문자열로 read
을 읽도록 지시합니다 ( 여기 참조 ).
위의 두 조각 모두에서 process.poll()
은 하위 프로세스가 완료 될 때까지 None
입니다. 읽을 출력이 없으면 루프를 종료하는 데 사용됩니다.
동일한 프로 시저가 서브 프로세스의 stderr
에 적용될 수 있습니다.
명령 목록 인수를 만드는 방법
명령 실행을 허용하는 서브 프로세스 메소드는 적어도 shell_mode=True
사용하여 목록 형식의 명령을 필요로합니다.
목록을 작성하는 규칙은 특히 복잡한 명령과 관련하여 항상 쉽지는 않습니다. 다행스럽게도 그렇게 할 수있는 매우 유용한 도구가 있습니다 : shlex
. 명령으로 사용할 목록을 만드는 가장 쉬운 방법은 다음과 같습니다.
import shlex
cmd_to_subprocess = shlex.split(command_used_in_the_shell)
간단한 예 :
import shlex
shlex.split('ls --color -l -t -r')
out: ['ls', '--color', '-l', '-t', '-r']