<html>
  <head>
    <meta content="text/html; charset=ISO-8859-1"
      http-equiv="Content-Type">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    <div class="moz-cite-prefix">On 3/31/2013 2:39 AM, Nick Coghlan
      wrote:<br>
    </div>
    <blockquote
cite="mid:CADiSq7dCY_8L7cA38Zo-AwS3_hBvuffh-kj5ZNY8oEcWYgxoYw@mail.gmail.com"
      type="cite">
      <div dir="ltr">
        <div class="gmail_extra">
          <div class="gmail_quote">On Sun, Mar 31, 2013 at 12:34 PM,
            Terry Jan Reedy <span dir="ltr"><<a
                moz-do-not-send="true" href="mailto:tjreedy@udel.edu"
                target="_blank">tjreedy@udel.edu</a>></span><br>
            <blockquote class="gmail_quote" style="margin:0px 0px 0px
              0.8ex;border-left:1px solid
              rgb(204,204,204);padding-left:1ex">
              I do not know enough about other circumstances in which
              stdin.fileno would do something other than return 0 to be
              sure of what the proper fix would be.  (I increasingly
              dislike bare excepts as they hide the thinking and
              knowledge of the original programmer. What exception was
              expected that should be passed away?)<br>
            </blockquote>
            <div><br>
            </div>
            <div>The other problem is that making *two* function calls
              inside a broad try/except is almost always a terrible
              idea.</div>
          </div>
        </div>
      </div>
    </blockquote>
    <br>
    That too. I could not decide which function an exception was
    expected from.<br>
    <br>
    <blockquote
cite="mid:CADiSq7dCY_8L7cA38Zo-AwS3_hBvuffh-kj5ZNY8oEcWYgxoYw@mail.gmail.com"
      type="cite">
      <div dir="ltr">
        <div class="gmail_extra">
          <div class="gmail_quote">
            <div> It seems to me that the intended logic is more like
              this:<br>
              <br>
            </div>
                try:<br>
          </div>
          <div class="gmail_quote">        # Close stdin if it wraps any
            fd other than 0<br>
          </div>
          <div class="gmail_quote">
            <div>        close_stdin = (sys.stdin.fileno() != 0)<br>
            </div>
            <div>    except (AttributeError, OSError,
              io.UnsupportedOperation):<br>
            </div>
            <div>        # Also close stdin if it doesn't expose a file
              descriptor<br>
            </div>
            <div>        close_stdin = True<br>
            </div>
            <div>    if close_stdin:<br>
            </div>
            <div>        try:<br>
            </div>
            <div>            sys.stdin.close()<br>
            </div>
            <div>        except Exception:<br>
            </div>
            <div>            pass<br>
            </div>
                raise SystemExit(code) <br>
          </div>
          <br>
        </div>
      </div>
    </blockquote>
    There are 4 possible situations for sys.stdin:<br>
    1. No .fileno<br>
    2. .fileno raises<br>
    3. .fileno() != 0<br>
    4. lfileno() == 0<br>
    I believe the current code calls .close for 1 and raises SystemExit
    for 2-4. Your code calls for 1-3 and raises for 4. I suspect that is
    correct.  For an rc patch, the safest temporary patch would be to
    start .__call__ with<br>
    <br>
    if sys.stdin.__name__ == 'PseudoInputFile': sys.stdin.close()<br>
    <br>
    I would have to check that the name is correct as seen in the user
    process (cannot at moment).<br>
    <br>
    The deeper problem, I think, is that none of sys.version,
    sys.hexversion, sys._version, sys.platform tell a program that it is
    running under Idle. It usually does not matter but there are a few
    situations in which it does.<br>
    <br>
    --<br>
    Terry Jan Reedy<br>
    <br>
  </body>
</html>