IPC con un subproceso de Python

Estoy tratando de hacer algo de IPC simple en Python de la siguiente manera: un proceso de Python lanza otro consubprocess. El proceso hijo envía algunos datos a una tubería y el proceso padre los recibe.

Aquí está mi implementación actual:

# parent.py
import pickle
import os
import subprocess
import sys
read_fd, write_fd = os.pipe()
if hasattr(os, 'set_inheritable'):
    os.set_inheritable(write_fd, True)
child = subprocess.Popen((sys.executable, 'child.py', str(write_fd)), close_fds=False)
try:
    with os.fdopen(read_fd, 'rb') as reader:
        data = pickle.load(reader)
finally:
    child.wait()
assert data == 'This is the data.'
# child.py
import pickle
import os
import sys
with os.fdopen(int(sys.argv[1]), 'wb') as writer:
    pickle.dump('This is the data.', writer)

En Unix, esto funciona como se esperaba, pero si ejecuto este código en Windows, aparece el siguiente error, después de lo cual el programa se bloquea hasta que se interrumpe:

Traceback (most recent call last):
  File "child.py", line 4, in <module>
    with os.fdopen(int(sys.argv[1]), 'wb') as writer:
  File "C:\Python34\lib\os.py", line 978, in fdopen
    return io.open(fd, *args, **kwargs)
OSError: [Errno 9] Bad file descriptor

Sospecho que el problema es que el proceso hijo no está heredando elwrite_fd descriptor de archivo. ¿Cómo puedo arreglar esto?

El código debe ser compatible con Python 2.7, 3.2 y todas las versiones posteriores. Esto significa que la solución no puede depender de la presencia o ausencia de los cambios en la herencia del descriptor de archivo especificados enPEP 446. Como se indicó anteriormente, también debe ejecutarse tanto en Unix como en Windows.

(Para responder un par de preguntas obvias: la razón por la que no estoy usandomultiprocessing es porque, en mi código no simplificado de la vida real, los dos programas de Python son parte de proyectos de Django con diferentes módulos de configuración. Esto significa que no pueden compartir ningún estado global. Además, las secuencias estándar del proceso secundario se están utilizando para otros fines y no están disponibles para esto).

ACTUALIZAR: Después de configurar elclose_fds parámetro, el código ahora funciona en todas las versiones de Python en Unix. Sin embargo, todavía falla en Windows.

Respuestas a la pregunta(2)

Su respuesta a la pregunta