Well maybe it's not the best technical answer but I wanted to dig about file descriptors. Following your question I made this two scripts. Os creates pipe and parent sends descriptors to child by pass_fds tuple. More info in python docs , os.read() description. After that parent's fdw is pushed as bytes to child proc and then used to send back some answer.
Hope it helps.
edit:
Found this post in google forums.
##### child.py
import subprocess, os
fdr_data = os.read(3,20) # 3 is inherited by pass_fds
fdw = int(fdr_data) # 4
print("CHILD fdw = ", fdw , "\n")
os.write(fdw, bytes("some answer".encode()))
exit()
##### parent.py
import subprocess, os, time
fdr, fdw = os.pipe() # new file descriptor read , fd write
print("PARENT", "fdr = ", fdr , " fdw = " , fdw)
subprocess.Popen(['python3','child.py'], pass_fds=(fdr, fdw))
os.write(fdw, bytes("{}".format(fdw).encode())) # pipe file descriptor write (out 4)
time.sleep(1) # so subproc can execute
read_pipe = os.read(fdr, 20) # pipe file descriptor read (in 3)
print("PARENT" , read_pipe.decode())