IPC com um subprocesso Python

Estou tentando fazer um IPC simples em Python da seguinte maneira: Um processo Python inicia outro comsubprocess. O processo filho envia alguns dados para um canal e o processo pai os recebe.

Aqui está minha implementação atual:

# 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)

No Unix, isso funciona conforme o esperado, mas se eu executar esse código no Windows, recebo o seguinte erro, após o qual o programa trava até ser interrompido:

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

Eu suspeito que o problema é que o processo filho não está herdando owrite_fd descritor de arquivo. Como posso consertar isso?

O código precisa ser compatível com o Python 2.7, 3.2 e todas as versões subseqüentes. Isso significa que a solução não pode depender da presença ou da ausência de alterações na herança do descritor de arquivo especificada emPEP 446. Como está implícito acima, ele também precisa ser executado no Unix e no Windows.

(Para responder a algumas perguntas óbvias: O motivo pelo qual não estou usandomultiprocessing é porque, no meu código não simplificado da vida real, os dois programas Python fazem parte de projetos do Django com diferentes módulos de configurações. Isso significa que eles não podem compartilhar nenhum estado global. Além disso, os fluxos padrão do processo filho estão sendo usados para outros fins e não estão disponíveis para isso.)

ATUALIZAR: Depois de definir oclose_fds parâmetro, o código agora funciona em todas as versões do Python no Unix. No entanto, ele ainda falha no Windows.

questionAnswers(2)

yourAnswerToTheQuestion