IT이야기

Python 하위 프로세스의 표준 입력

cyworld 2021. 10. 26. 19:27
반응형

Python 하위 프로세스의 표준 입력에 어떻게 쓰나요?


하위 프로세스를 시작하고 하위 프로세스 stdin에 쓰는 Python 스크립트를 작성하려고 합니다. 또한 하위 프로세스가 충돌하는 경우 취해야 할 조치를 결정할 수 있기를 바랍니다.

내가 시작하려고 하는 프로세스는 nuke명령을 제출할 수 있고 명령이 실행된 후 종료하도록 지시할 수 있는 자체 내장 Python 버전 이 있는 프로그램 입니다. 지금까지 명령 프롬프트에서 Python을 시작한 nuke다음 하위 프로세스로 시작 하면 명령을 입력할 수 nuke있지만 이 모든 것을 스크립트에 넣을 수 있기를 원합니다. Python 프로그램을 시작한 nuke다음 표준 입력 (따라서 Python의 내장 버전)에 쓰고 멋진 일을 하도록 지시할 수 있으므로 다음 nuke과 같이 시작하는 스크립트를 작성했습니다 .

subprocess.call(["C:/Program Files/Nuke6.3v5/Nuke6.3", "-t", "E:/NukeTest/test.nk"])

그러면 nuke사용자 입력을 기다리고 있기 때문에 아무 일도 일어나지 않습니다 . 이제 표준 입력에 어떻게 쓰나요?

nuke여러 프레임을 렌더링할 때 간헐적으로 충돌을 일으키는 플러그인을 실행하고 있기 때문에 이 작업을 수행하고 있습니다. 따라서 이 스크립트가 시작되고 nuke, 무언가를 하도록 지시한 다음 충돌이 발생하면 다시 시도 할 수 있기를 바랍니다. 따라서 충돌을 포착하고 여전히 괜찮을 수 있는 방법이 있다면 그것은 좋을 것입니다.


다음을 사용하는 것이 좋습니다 communicate.

from subprocess import Popen, PIPE, STDOUT
p = Popen(['myapp'], stdout=PIPE, stdin=PIPE, stderr=PIPE)
stdout_data = p.communicate(input='data_to_write')[0]

이 경고 때문에 "더 나은":

.stdin.write, .stdout.read 또는 .stderr.read 대신에 communication()을 사용하여 자식 프로세스를 채우고 차단하는 다른 OS 파이프 버퍼로 인한 교착 상태를 방지합니다.


stdin인수에 파일류 객체를 제공할 수 있습니다 subprocess.call().

문서 에 대한 Popen목적은 여기에 적용됩니다.

출력을 캡처하려면 subprocess.check_output()유사한 인수 를 사용 하는 를 대신 사용해야 합니다. 문서에서:

>>> subprocess.check_output(
...     "ls non_existent_file; exit 0",
...     stderr=subprocess.STDOUT,
...     shell=True)
'ls: non_existent_file: No such file or directory\n'

다음은이 방법 처럼 보인다 에서 NUKE 11.3v4의 상용 버전 Windows 10:

import subprocess

# Run NUKE's script in Terminal mode on Windows machine...
subprocess.Popen(['C:/Program Files/Nuke11.3v4/Nuke11.3.exe', '-t', 'E:/NukeTest/test.nk'], stdin=PIPE, stdout=PIPE)

비상업용 버전의 NUKE 11.3v4에서 작동하는 방법은 다음과 같습니다 macOS 10.14.

import subprocess
from subprocess import Popen, PIPE
import time

# Run NUKE's script in Terminal mode on MacOS machine...
np = subprocess.Popen(['/Applications/Nuke11.3v4/NukeX11.3v4 Non-commercial.app/NukeX11.3v4 Non-commercial', '-t', '/Users/<username>/Desktop/test.nknc'], stdin=PIPE, stdout=PIPE)

# Choose a method to wait for the subprocess to finish...
np.wait() 
time.sleep(5)        

data = np.communicate(input='data')[0]

print(data)

결과는 다음과 같습니다.

'''
NukeX 11.3v4, 64 bit, built May  1 2019.
Copyright (c) 2019 The Foundry Visionmongers Ltd.  All Rights Reserved.
Non-commercial mode active.
Licence expires on: 2019/7/27
(11, 3, 4)
('darwin', 'posix')
/Applications/Nuke11.3v4/Nuke11.3v4.app/Contents/MacOS/../Frameworks/Python.framework/Versions/Current/
Disk cache /var/tmp/nuke-u501/ViewerCache/??: 424MB (5% of 10240MB) used in 81 files.

'''

또한 -v이미지 플래그를 사용하여 GUI에서 하위 프로세스를 실행할 수 있습니다.

subprocess.Popen(['C:/Program Files/Nuke11.3v4/Nuke11.3.exe', '-v', 'E:/NukeTestImages/image.exr'], stdin=PIPE, stdout=PIPE)

도움이 되었기를 바랍니다.

ReferenceURL : https://stackoverflow.com/questions/8475290/how-do-i-write-to-a-python-subprocess-stdin

반응형