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
'IT이야기' 카테고리의 다른 글
Spring 3.0 MVC 바인딩 Enums 대소문자 구분 (0) | 2021.10.26 |
---|---|
python pip에 대한 설치 순서를 지정하는 방법 (0) | 2021.10.26 |
로그 눈금으로 눈금 설정 (0) | 2021.10.25 |
Sequelize.sync(), 특히 강제 옵션 작동 원리 (0) | 2021.10.25 |
이들go get과 go install의 차이점 (0) | 2021.10.25 |