This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: Subprocess error with I/O redirection to Pipes
Type: crash Stage:
Components: Library (Lib), Windows Versions: Python 2.6
process
Status: closed Resolution:
Dependencies: Superseder:
Assigned To: Nosy List: ocean-city, pakal
Priority: normal Keywords:

Created on 2008-10-24 15:23 by pakal, last changed 2022-04-11 14:56 by admin. This issue is now closed.

Messages (4)
msg75169 - (view) Author: Pascal Chambon (pakal) * Date: 2008-10-24 15:23
I've created on my desktop a file flooder.py containing just the following:
##################
import sys, os

progress=open(r"C:\Users\v-pascha\Desktop\STDERR.txt","w")

for i in range(101):
   print str(i)*20
   progress.write( str(i)+"\n" )
   
progress.close()
##################


and a file receiver.py containing just :


################
import sys, os, subprocess

#os.system("pause")
subprocess.Popen(r"python
C:\Users\v-pascha\Desktop\flooder.py",stdin=subprocess.PIPE,stdout=subprocess.PIPE)
#,stdin=subprocess.PIPE,stdout=subprocess.PIPE
#os.system("pause")

#####################

And when I launch receiver.py, I get a crash with that (not explicit)
message :
"close failed in file object destructor:
Error in sys.excepthook:

Original exception was:"

The crash doesn't happen if I don't redirect the stdout and stdin of the
child process. So it seems something weird happens when subprocess tries
to redirect the child's I/O to the PIPEs...
msg83130 - (view) Author: Hirokazu Yamamoto (ocean-city) * (Python committer) Date: 2009-03-04 19:48
Probably this happens because receiever.py doesn't wait for flooder.py
termination, and pipe end is closed when recieiver.py terminates.

Does this code work for you?

p = subprocess.Popen("python
flooder.py",stdin=subprocess.PIPE,stdout=subprocess.PIPE)
p.wait()
msg83131 - (view) Author: Hirokazu Yamamoto (ocean-city) * (Python committer) Date: 2009-03-04 20:19
This happens because when flooder.py terminates, its stdout will be
closed, but another pipe end in receirver.py process is already closed, so

Python\sysmodule.c(1098): _check_and_flush (FILE *stream)

In this function, fflush() fails. The reason why error message is not
helpful is probably this close function is called in interpreter
termination process, other modules/objects to do so are already destroyed.

Maybe this error message can be improved in some way, but I'm not sure.
msg83217 - (view) Author: Pascal Chambon (pakal) * Date: 2009-03-05 21:23
Thansk a lot for reviewing the problem

Indeed, "p.wait()" seems to do the trick in this case.

Is there any global way to avoid such pipe problems ? I mean, in any
case, one end of each pipe has to be closed before the other end, so
such errors might occur with the child process' stdin (in case the child
dies first and the parent flushes then its pipe toward the child's
stdin) or with its stdout (if the parent dies first and the child
flushes then its stdout). 

Or are we sure that there won't be errors as long as children die before
the parent process ?
History
Date User Action Args
2022-04-11 14:56:40adminsetgithub: 48442
2009-09-30 06:50:11pakalsetstatus: open -> closed
2009-03-05 21:23:02pakalsetmessages: + msg83217
2009-03-04 20:19:24ocean-citysetmessages: + msg83131
2009-03-04 19:48:10ocean-citysetnosy: + ocean-city
messages: + msg83130
2008-10-24 15:23:18pakalcreate