Jeffrey Harris
Jeffrey Harris

Reputation: 3550

Determining if stdout for a Python process is redirected

I've noticed that curl can tell whether or not I'm redirecting its output (in which case it puts up a progress bar).

Is there a reasonable way to do this in a Python script? So:

$ python my_script.py
Not redirected

and

$ python my_script.py > output.txt  
Redirected!

Upvotes: 26

Views: 4991

Answers (3)

DigitalRoss
DigitalRoss

Reputation: 146093

Actually, what you want to do here is find out if stdin and stdout are the same thing.

$ cat test.py
import os
print(os.fstat(0) == os.fstat(1))
$ python test.py
True
$ python test.py > f
$ cat f
False
$ 

The longer but more traditional version of the are they the same file test just compares st_ino and st_dev. Typically, on windows these are faked up with a hash of something so that this exact design pattern will work.

Upvotes: 16

nosklo
nosklo

Reputation: 222922

import sys

if sys.stdout.isatty():
    print("Not redirected")
else:
    sys.stderr.write("Redirected!\n")

Upvotes: 50

Jim Garrison
Jim Garrison

Reputation: 86774

Look at

os.isatty(fd)  

(I don't think this works on Windows, however)

Upvotes: 4

Related Questions