Development

NAVIGATION
CATEGORIES
REFERRENCE
LINKS
  • prog1 | prog2 . How not to make prog2 block if not piped?

    7 answers - 614 bytes - related search similar search Add To My Delicious Add To My Stumble Upon Add To My Google Mark Add To My Facebook Add To My Digg Add To My Reddit

    I googled around, but couldn't understand how to solve this problem.
    I have 2 scripts
    # script1.py #
    print 'something'
    #script2.py
    x=sys.stdin.read()
    print 'passed'
    if I run
    script1.py | script2.py
    all goes well.
    But if I run just
    script2.py
    the program blocks waiting forever for input.
    *nix I used select.select to solve this problem, but on windows?
    I read that maybe I should use, from win32api, GetStdHandle and
    WaitForM, but how to do it it's far from my knowledge.
    Any help?
    Thank you,
    Riccardo
  • No.1 | | 756 bytes | |

    Le Mercredi 14 Juin 2006 17:13, riquito (AT) gmail (DOT) com a *:
    # script1.py #
    print 'something'

    #script2.py
    x=sys.stdin.read()
    read() will read a file object to the end, i guess you want to use readline()
    instead or the builtin raw_input.

    print 'passed'

    if I run
    script1.py | script2.py
    all goes well.
    This is because when script1.py ends, it will send an 'EF' char to
    script2.py, wich terminate the read method.

    But if I run just
    script2.py
    the program blocks waiting forever for input.
    here, newlines ('\n'), doesn't terminate the read call, you can stop the read
    by typing ctrl+d at the beginnning of a new line in a normal unix terminal.
  • No.2 | | 1043 bytes | |

    do u really need read something even when you run the scripts2.py directly?
    why not just change script2.py to
    #script2.py
    if __name__ == "__main__":
    x=sys.stdin.read()
    print 'passed'
    else:
    print 'passed from else branch'

    is it what you want? or anything i misunderstand.

    14 Jun 2006 08:13:04 -0700, riquito (AT) gmail (DOT) com <riquito (AT) gmail (DOT) comwrote:
    I googled around, but couldn't understand how to solve this problem.
    I have 2 scripts

    # script1.py #
    print 'something'

    #script2.py
    x=sys.stdin.read()
    print 'passed'

    if I run
    script1.py | script2.py
    all goes well.

    But if I run just
    script2.py
    the program blocks waiting forever for input.

    *nix I used select.select to solve this problem, but on windows?
    I read that maybe I should use, from win32api, GetStdHandle and
    WaitForM, but how to do it it's far from my knowledge.

    Any help?

    Thank you,
    Riccardo
  • No.3 | | 470 bytes | |

    imcs ee ha scritto:

    do u really need read something even when you run the scripts2.py directly?
    why not just change script2.py to
    #script2.py
    if __name__ == "__main__":
    x=sys.stdin.read()
    print 'passed'
    else:
    print 'passed from else branch'

    is it what you want? or anything i misunderstand.

    it won't do. clever btw.
    Script2 is not a module, it's a program that _could_ receive input via
    pipe.
  • No.4 | | 641 bytes | |

    yeah, forget my post ,it;s useless.
    sorry for my thoughtless
    14 Jun 2006 10:40:15 -0700, riquito (AT) gmail (DOT) com <riquito (AT) gmail (DOT) comwrote:

    imcs ee ha scritto:

    do u really need read something even when you run the scripts2.py directly?
    why not just change script2.py to
    #script2.py
    if __name__ == "__main__":
    x=sys.stdin.read()
    print 'passed'
    else:
    print 'passed from else branch'

    is it what you want? or anything i misunderstand.

    it won't do. clever btw.
    Script2 is not a module, it's a program that _could_ receive input via
    pipe.
  • No.5 | | 213 bytes | |

    riquito (AT) gmail (DOT) com enlightened us with:
    Script2 is not a module, it's a program that _could_ receive input
    via pipe.
    Then simply send it an EF manually if it doesn't.
    Sybren
  • No.6 | | 1249 bytes | |

    imcs ee wrote:
    yeah, forget my post ,it;s useless.
    sorry for my thoughtless
    14 Jun 2006 10:40:15 -0700, riquito (AT) gmail (DOT) com <riquito (AT) gmail (DOT) comwrote:

    >>imcs ee ha scritto:
    >>
    >>

    do u really need read something even when you run the scripts2.py directly?
    why not just change script2.py to
    #script2.py
    if __name__ == "__main__":
    x=sys.stdin.read()
    print 'passed'
    else:
    print 'passed from else branch'

    is it what you want? or anything i misunderstand.
    >>
    >>it won't do. clever btw.
    >>Script2 is not a module, it's a program that _could_ receive input via
    >>pipe.
    >>

    It really doesn't matter *how* it receives input, whether from a pipe,
    or a terminal or a redirected file.

    When you run it "standalone" you should give it some input - type some
    text then enter ^D (on Unix-like systems) or ^Z (on Windows). How else
    do you expect read() to return anything? It *has* to read to the end fo
    the file before it returns a value.

    regards
    Steve
  • No.7 | | 549 bytes | |

    Steve Holden ha scritto:

    When you run it "standalone" you should give it some input - type some
    text then enter ^D (on Unix-like systems) or ^Z (on Windows). How else
    do you expect read() to return anything? It *has* to read to the end fo
    the file before it returns a value.

    regards
    Steve

    you've got reason.
    I must read my command line options, if then there is still text I use
    that, otherwise I read from stdin. If nothing was piped, the user must
    complete the work.

    Thank you all,
    Riccardo

Re: prog1 | prog2 . How not to make prog2 block if not piped?


max 4000 letters.
Your nickname that display:
In order to stop the spam: 5 + 5 =
QUESTION ON "Development"

EMSDN.COM