I am writing a script to automate database imports in MySQL. I'm trying to write code that displays the output of pv
as the database is imported:
pv = subprocess.Popen(
["pv", "-f", restore_filepath],
bufsize=1,
stderr=subprocess.PIPE,
stdout=subprocess.PIPE,
universal_newlines=True,
shell=True,
)
subprocess.Popen(
[
"mysql",
"-u{}".format(db_user),
"-p{}".format(db_pass),
db_name,
],
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.DEVNULL,
stdin=pv.stdout,
)
for line in pv.stderr:
print("hello")
sys.stdout.write("\r" + line.rstrip("\n"))
sys.stdout.flush()
This is based on the code in this question, but it is not working for me. The hello
never even gets printed, even if I comment out the other lines in the for loop - for line in pv.stderr
is blocking and I don't know why. It never unblocks, so even once the process has completed, the program is still stuck - I have to kill it.
What am I doing wrong that is causing for line in pv.stderr
to block?