I have working code from Python 2 which uses "pickle" to talk to a subprocess via stdin/stdio. I'm trying to make that work in Python 3.
First, the subprocess Python is invoked with the "-d' option, so stdin and stdio are supposed to be unbuffered binary streams. That was enough in Python 2, but it's not enough in Python 3. The subprocess and its connections are set up with proc = subprocess.Popen(launchargs,stdin=subprocess.PIPE, stdout=subprocess.PIPE, env=env) ... self.reader = pickle.Unpickler(self.proc.stdout) self.writer = pickle.Pickler(self.proc.stdin, 2) after which I get result = self.reader.load() TypeError: 'str' does not support the buffer interface That's as far as traceback goes, so I assume this is disappearing into C code. OK, I know I need a byte stream. I tried self.reader = pickle.Unpickler(self.proc.stdout.buffer) self.writer = pickle.Pickler(self.proc.stdin.buffer, 2) That's not allowed. The "stdin" and "stdout" that are fields of "proc" do not have "buffer". So I can't do that in the parent process. In the child, though, where stdin and stdout come from "sys", "sys.stdin.buffer" is valid. That fixes the ""str" does not support the buffer interface error." But now I get the pickle error "Ran out of input" on the process child side. Probably because there's a str/bytes incompatibility somewhere. So how do I get clean binary byte streams between parent and child process? John Nagle -- https://mail.python.org/mailman/listinfo/python-list