FAQ
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,

Search Discussions

  • John Gordon at Jun 10, 2011 at 8:48 pm

    In <6e035898-8938-4a61-91de-7a0ea7ead8ab at y30g2000yqb.googlegroups.com> virdo <virdoo at gmail.com> writes:

    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.

    --
    John Gordon A is for Amy, who fell down the stairs
    gordon at panix.com B is for Basil, assaulted by bears
    -- Edward Gorey, "The Gashlycrumb Tinies"
  • Virdo at Jun 10, 2011 at 8:56 pm

    On Jun 10, 4:48?pm, John Gordon wrote:
    In <6e035898-8938-4a61-91de-7a0ea7ead... at y30g2000yqb.googlegroups.com> virdo <vir... at gmail.com> writes:
    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.
    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
  • Hans Mulder at Jun 10, 2011 at 9:56 pm

    On 10/06/11 22:56:06, virdo wrote:
    On Jun 10, 4:48 pm, John Gordonwrote:
    In<6e035898-8938-4a61-91de-7a0ea7ead... at y30g2000yqb.googlegroups.com> virdo<vir... at gmail.com> writes:
    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.
    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
  • Virdo at Jun 10, 2011 at 10:34 pm

    On Jun 10, 5:56?pm, Hans Mulder wrote:
    On 10/06/11 22:56:06, virdo wrote:








    On Jun 10, 4:48 pm, John Gordon<gor... at panix.com> ?wrote:
    In<6e035898-8938-4a61-91de-7a0ea7ead... at y30g2000yqb.googlegroups.com> ?virdo<vir... at gmail.com> ?writes:
    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.
    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
    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!

Related Discussions

Discussion Navigation
viewthread | post
Discussion Overview
grouppython-list @
categoriespython
postedJun 10, '11 at 8:42p
activeJun 10, '11 at 10:34p
posts5
users3
websitepython.org

3 users in discussion

Virdo: 3 posts Hans Mulder: 1 post John Gordon: 1 post

People

Translate

site design / logo © 2022 Grokbase