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

R

riquito

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.

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

Any help?

Thank you,
Riccardo
 
M

Maric Michaud

Le Mercredi 14 Juin 2006 17:13, (e-mail address removed) a écrit :
# 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 'EOF' 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.


--
_____________

Maric Michaud
_____________

Aristote - www.aristote.info
3 place des tapis
69004 Lyon
Tel: +33 426 880 097
 
I

imcs ee

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.
 
R

riquito

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.
 
S

Sybren Stuvel

(e-mail address removed) enlightened us with:
Script2 is not a module, it's a program that _could_ receive input
via pipe.

Then simply send it an EOF manually if it doesn't.

Sybren
 
S

Steve Holden

imcs said:
yeah, forget my post ,it;s useless.
sorry for my thoughtless
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
 
R

riquito

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
 

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,769
Messages
2,569,581
Members
45,056
Latest member
GlycogenSupporthealth

Latest Threads

Top