수색…


통사론

  • 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.callsubprocess.check_output 대체하십시오. 고급 사용을 위해 참조 .

Popen의 유연성 향상

사용 subprocess.Popen 것보다 시작 프로세스를보다 세밀하게 제어 할 줄 subprocess.call .

하위 프로세스 시작

process = subprocess.Popen([r'C:\path\to\app.exe', 'arg1', '--flag', 'arg'])

Popen 의 서명은 call 함수와 매우 비슷합니다. 그러나 Popencall 이 수행하는 것처럼 하위 프로세스가 완료되기를 기다리는 대신 즉시 반환됩니다.

완료 할 수있는 하위 프로세스 대기 중

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

실행중인 하위 프로세스에 대한 대화식 액세스

하위 프로세스가 완료되지 않은 경우에도 stdinstdout 에서 읽고 쓸 수 있습니다. 이 기능은 다른 프로그램에서 기능을 자동화 할 때 유용 할 수 있습니다.

서브 프로세스에 쓰기

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.

그러나 동적 상호 작용보다는 입출력 세트가 하나만 필요한 경우에는 stdinstdout 직접 액세스하는 대신 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']


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow