[issue29174] 'NoneType' object is not callable in subprocess.py

STINNER Victor report at bugs.python.org
Fri Jan 6 05:09:09 EST 2017


STINNER Victor added the comment:

> 1. The call to warnings.warn is not usable during interpreter shutdown (and running `python -W ignore test.py` has no effect)

Oops right. I just fixed this issue.


> 2. Calling "process.terminate()" or "process.kill()" at in the testcase or in an atexit handler would not get rid of the warning, one must set the return code on the Popen object

Hum. I should document somehow how to fix such bug: you must read the exit status of the child process, not set manually the returncode attribute. You have to call the wait() method of each process after calling terminate().


> 3. The warning can show up in existing code that has absolutely no zombie problems.

I modified your example to list zombi processes: try test2.py.

Output:

$ ./python test2.py 
0  1000 25520 25120  20   0 140940 11828 wait   S+   pts/0      0:00 ./python test2.py
0  1000 25521 25520  20   0      0     0 -      Z+   pts/0      0:00 [python] <defunct>
0  1000 25522 25520  20   0      0     0 -      Z+   pts/0      0:00 [python] <defunct>
0  1000 25523 25520  20   0      0     0 -      Z+   pts/0      0:00 [python] <defunct>
0  1000 25524 25520  20   0      0     0 -      Z+   pts/0      0:00 [python] <defunct>
0  1000 25525 25520  20   0      0     0 -      Z+   pts/0      0:00 [python] <defunct>
0  1000 25526 25520  20   0      0     0 -      Z+   pts/0      0:00 [python] <defunct>
0  1000 25527 25520  20   0      0     0 -      Z+   pts/0      0:00 [python] <defunct>
0  1000 25528 25520  20   0      0     0 -      Z+   pts/0      0:00 [python] <defunct>
0  1000 25529 25520  20   0 119032  3008 wait   S+   pts/0      0:00 sh -c ps l|grep 25520
0  1000 25531 25529  20   0 118540   880 -      S+   pts/0      0:00 grep 25520
Lib/subprocess.py:761: ResourceWarning: subprocess 25528 is still running
sys:1: ResourceWarning: unclosed file <_io.FileIO name=18 mode='wb' closefd=True>
sys:1: ResourceWarning: unclosed file <_io.FileIO name=19 mode='rb' closefd=True>
(...)

The long list of <defunct> are the zombi processes: it means that the kernel is unable to remove completely child processes because the parent didn't read the exit status yet. Process identifiers and memory are wasted.

The warning can also help to detect when an application forgot to check the exit status. At least, if you add a call to process.wait(), it becomes explicit that ignoring the exit status is deliberate.

----------
nosy: +martin.panter
Added file: http://bugs.python.org/file46172/test2.py

_______________________________________
Python tracker <report at bugs.python.org>
<http://bugs.python.org/issue29174>
_______________________________________


More information about the Python-bugs-list mailing list