prog1 | prog2 . How not to make prog2 block if not piped?
7 answers - 614 bytes -

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