Help with a piping error

V

virdo

Hi,

I'm getting the following error and I can't Google my way out of it:

close failed in file object destructor:
sys.excepthook is missing
lost sys.stderr

My python file is simple print "test". I run it, it works no problem.
I pipe the output to a file "run > logfile" and that's the error I
get. This is with Windows Server 2008 (64 bit) using ActivePython
2.7.1.4 (64 bit).

Cheers,
 
J

John Gordon

In said:
My python file is simple print "test". I run it, it works no problem.
I pipe the output to a file "run > logfile" and that's the error I
get. This is with Windows Server 2008 (64 bit) using ActivePython
2.7.1.4 (64 bit).

Are you using an actual pipe symbol in your command? Your post title
suggests you are, but your sample command uses the greater-than symbol.

It's always best to include the actual command and the actual output
rather than typing it by hand, specifically to avoid errors like this.

Please repost a transcript of your real session.
 
V

virdo

Are you using an actual pipe symbol in your command?  Your post title
suggests you are, but your sample command uses the greater-than symbol.

My apologies, I miswrote. It is the greater than symbol rather than a
pipe.

Example:

c:\PRG>test.py > test.log
close failed in file object destructor:
sys.excepthook is missing
lost sys.stderr
 
H

Hans Mulder

My apologies, I miswrote. It is the greater than symbol rather than a
pipe.

Example:

c:\PRG>test.py> test.log
close failed in file object destructor:
sys.excepthook is missing
lost sys.stderr

I think your problem is that some other process still has opened the
file test.log and Python cannot write it. Unfortunately, Python only
finds out when it is shutting down and cleaning out the "sys" module.
An exception is raised, but sys.excepthook has already been disposed.
Python's normal fallback stategy is to write the exception and the
traceback to sys.stderr. Unfortunately, sys.stderr has been disposed
as well.

I get a similar message if I try to write to a closed pipe:

$ python -c 'print "test"' | false
close failed in file object destructor:
sys.excepthook is missing
lost sys.stderr
$

I think this is a bug in Pyhton: the interpreter should flush sys.stdout
before tering dwn the 'sys' module, so that it can report an excption if
the flush attempt fails.

A work-around is to add "import sys" at the top of your script, and
"sys.stdout.flush()" at the bottom:

import sys
print "test"
sys.stdout.flush()

That should report a proper exception; for example:

$ python -c 'import sys; print "test"; sys.stdout.flush();' | false
Traceback (most recent call last):
File "<string>", line 1, in <module>
IOError: [Errno 32] Broken pipe
$

Hope this helps,

-- HansM
 
V

virdo

My apologies, I miswrote. It is the greater than symbol rather than a
pipe.

c:\PRG>test.py>  test.log
close failed in file object destructor:
sys.excepthook is missing
lost sys.stderr

I think your problem is that some other process still has opened the
file test.log and Python cannot write it.  Unfortunately, Python only
finds out when it is shutting down and cleaning out the "sys" module.
An exception is raised, but sys.excepthook has already been disposed.
Python's normal fallback stategy is to write the exception and the
traceback to sys.stderr.  Unfortunately, sys.stderr has been disposed
as well.

I get a similar message if I try to write to a closed pipe:

$  python -c 'print "test"' | false
close failed in file object destructor:
sys.excepthook is missing
lost sys.stderr
$

I think this is a bug in Pyhton: the interpreter should flush sys.stdout
before tering dwn the 'sys' module, so that it can report an excption if
the flush attempt fails.

A work-around is to add "import sys" at the top of your script, and
"sys.stdout.flush()" at the bottom:

import sys
print "test"
sys.stdout.flush()

That should report a proper exception; for example:

$ python -c 'import sys; print "test"; sys.stdout.flush();' | false
Traceback (most recent call last):
   File "<string>", line 1, in <module>
IOError: [Errno 32] Broken pipe
$

Hope this helps,

-- HansM

Thank you Hans! I've got it working, and posting it in case others end
up running into the same problem.

When I first changed the python test.py file to :

import sys
print "yes"
sys.stdout.flush()

I got :
test2.py > test2.log
Traceback (most recent call last):
File "C:\PRG\blah\test2.py", line 3, in <module>
sys.stdout.flush()
IOError: [Errno 9] Bad file descriptor

Googled a bit for the solution, but then I've ran your version
(slightly modified) with no errors:

python -c "import sys; print 'test'; sys.stdout.flush();" > test.log

Finally, when I run the .py file with "python test.py > test.log" as
opposed to just "test.py > test.log" or "test > test.log", it works.
I've tried figuring out what the problem is, but from the quick
glance, python that runs .py files and python that's in my path both
are the same "c:\Python27\python.exe".

I'm happy with the workaround however :)

Thanks!
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,756
Messages
2,569,535
Members
45,008
Latest member
obedient dusk

Latest Threads

Top