IPC с подпроцессом Python

Я пытаюсь сделать несколько простых IPC в Python следующим образом: один процесс Python запускает другой сsubprocess, Дочерний процесс отправляет некоторые данные в канал, а родительский процесс получает их.

Вот моя текущая реализация:

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

В Unix это работает как положено, но если я запускаю этот код в Windows, я получаю следующую ошибку, после которой программа зависает до тех пор, пока не прервется:

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

Я подозреваю, что проблема в том, что дочерний процесс не наследуетwrite_fd дескриптор файла. Как я могу это исправить?

Код должен быть совместим с Python 2.7, 3.2 и всеми последующими версиями. Это означает, что решение не может зависеть ни от наличия, ни от отсутствия изменений в наследовании файловых дескрипторов, указанных вОПТОСОЗ 446, Как подразумевается выше, он также должен работать как в Unix, так и в Windows.

(Чтобы ответить на пару очевидных вопросов: причина, по которой я не используюmultiprocessing потому что в моем реальном неупрощенном коде две программы на Python являются частью проектов Django с разными модулями настроек. Это означает, что они не могут делить ни одно глобальное состояние. Кроме того, стандартные потоки дочернего процесса используются для других целей и недоступны для этого.)

ОБНОВИТЬ: После настройкиclose_fds Параметр, код теперь работает во всех версиях Python на Unix. Тем не менее, он все еще не работает в Windows.

Ответы на вопрос(0)

Ваш ответ на вопрос