Issue 30203: AttributeError in Popen.communicate() (original) (raw)

In my application, calling communicate() on a Popen instance is giving the following exception:

. . . File "/usr/lib/python3.5/subprocess.py", line 1072, in communicate stdout, stderr = self._communicate(input, endtime, timeout) File "/usr/lib/python3.5/subprocess.py", line 1693, in _communicate stdout = self._fileobj2output[self.stdout] AttributeError: 'Popen' object has no attribute '_fileobj2output'

I have not been able to reproduce this in a simple example, but I imagine this could happen if Popen._communicate() raises an exception in the first 20 lines or so--this would cause _communication_started to be set True, even though _fileobj2output has not been initialized.

I suggest setting self._fileobj2output = None in Popen.init() and changing the relevant code in _communicate() from

        if not self._communication_started:
            self._fileobj2output = {}

to:

        if self._fileobj2output is None:
            self._fileobj2output = {}

Update: this appears to be the prior exception that causes _communication_started and _fileobj2ouput to be out of sync:

File "/usr/lib/python3.5/subprocess.py", line 1072, in communicate stdout, stderr = self._communicate(input, endtime, timeout) File "/usr/lib/python3.5/subprocess.py", line 1672, in _communicate self.stdin.flush() ValueError: flush of closed file