Log in

View Full Version : python piping subprocesses failes if print() is in vpy script


_Al_
23rd March 2025, 05:27
I have simple command line, which works ok, as it suppose to:
vspipe.exe test.vpy -c y4m - | ffmpeg.exe -y -i - out.mp4
test.vpy:

from vapoursynth import core
clip = core.ffms2.Source('source.avi')
clip.set_output()
print("Hi")
Notice that print() statement in it. In command prompt it works fine. Also it works in python script, as in code below, BUT only without that print() line in vapoursynth script:
import subprocess
import shlex

cmd = 'vspipe.exe test.vpy -c y4m - | ffmpeg.exe -y -i - out.mp4'
new_args = cmd.split('|')
cmd_lists = [shlex.split(arg) for arg in new_args]
process1 = subprocess.Popen(cmd_lists[0], stdout=subprocess.PIPE)
output, _ = process1.communicate()

process2 = subprocess.Popen(cmd_lists[1], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
output2, _ = process2.communicate(input=output)
So if that print() is in that script, it fails if using python to encode.
Does anyone know what is going on? I tried to redirect stdout to nul, like below , it did not help.
import subprocess
import shlex
import contextlib
import os

cmd = 'vspipe.exe test.vpy -c y4m - | ffmpeg.exe -y -i - out.mp4'
new_args = cmd.split('|')
cmd_lists = [shlex.split(arg) for arg in new_args]

with contextlib.redirect_stdout(open(os.devnull, 'w')):
process1 = subprocess.Popen(cmd_lists[0], stdout=subprocess.PIPE)
output, _ = process1.communicate()
process2 = subprocess.Popen(cmd_lists[1], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
output2, _ = process2.communicate(input=output)

HolyWu
23rd March 2025, 06:24
import sys
print("Hi", file=sys.stderr)

_Al_
23rd March 2025, 06:50
Thanks! :-)