Interactive scripts (back on topic for once) [was Re: The "loop and a half"]

Peter J. Holzer hjp-usenet3 at hjp.at
Fri Oct 6 04:36:39 EDT 2017


On 2017年10月06日 08:09, Steve D'Aprano <steve+python at pearwood.info> wrote:
> What are the right ways for a Python script to detect these sorts of
> situations?
>> (1) Standard input is coming from a pipe;
>> (2) Stdin is being read from a file;
>> (3) Stdin is coming from a human at a terminal;
>> I get these. How did I do?
>>> # 1 detect input coming from a pipe.
> import sys
> import os
> from stat import S_ISFIFO
> if S_ISFIFO(os.fstat(0).st_mode):
> print("Reading from a pipe")
>>> # 2 detect input coming from a regular file.
> from stat import S_ISREG
> if S_ISREG(os.fstat(0).st_mode):
> print("Reading from a file.")
>> # 3 detect a terminal, hopefully with a human typing at it
> if os.isatty(0):
> print("Oy noddy, wake up and type something, I'm waiting for you!")

I'd do it the same way.
> I feel a bit weird about using the magic constant 0 here. Is that guaranteed
> to be stdin on all platforms?

It is guaranteed on POSIX compatible OSs. I think it is also guaranteed
on Windows, Don't know about VMS or the IBM OSs.
> Or should I be using sys.stdin.fileno()?

I'm not conviced that this is much more portable: A platform where stdin
doesn't use file descriptor 0 under the hood might not even use simple
integers as file descriptors at all.
 hp
-- 
 _ | Peter J. Holzer | Fluch der elektronischen Textverarbeitung:
|_|_) | | Man feilt solange an seinen Text um, bis
| | | hjp at hjp.at | die Satzbestandteile des Satzes nicht mehr
__/ | http://www.hjp.at/ | zusammenpaßt. -- Ralph Babel


More information about the Python-list mailing list

AltStyle によって変換されたページ (->オリジナル) /