Skip to content Skip to sidebar Skip to footer

Python Output To Console Within Subprocess From The Child Scricpt

in my parent script, I do the following: fout=open(outfile,'w') ferr = open(errfile,'w') subprocess.call('1.py',stdout=fout,stderr=ferr,shell=True) In the 1.py, script, I want mo

Solution 1:

If stdout, stderr are redirected then you could try to print directly to the console:

try: # Windowsfrom msvcrt import putwch

    defprint_to_console(message):
        for c in message:
            putwch(c)
        # newline
        putwch('\r') 
        putwch('\n')
except ImportError: # Uniximport os

    fd = os.open('/dev/tty', os.O_WRONLY | os.O_NOCTTY)
    tty = os.fdopen(fd, 'w', 1)
    del fd
    defprint_to_console(message, *, _file=tty):
        print(message, file=_file)
    del tty

Example:

print_to_console("Hello TTY!")
# -> Hello TTY!

Solution 2:

If you are in control of what's in 1.py, you could have your own instances of stdout and stderr You could alternatively, not redirect stdout/stdin in for 1.py, and instead pass fout/ferr to it as parameters. something like:

# assuming python 2.7.x
from __future__ import print_function
import argparse
import sys

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument('--stdout'
                       , nargs='?'
                       , type=argparse.FileType('a')
                       , default=sys.stdout)
    parser.add_argument( '--stderr'
                       , nargs='?'
                       , type=argparse.FileType('a')
                       , default=sys.stderr)

    namespace = parser.parse_args()

    print("Hello There", file=namespace.stdout)
    print("Error time", file=namespace.stderr)
    print("Always to stdout")
    print("Always to stderr", file=sys.stderr)

And then run it like so:

python 1.py --stdout=outfile.log stderr=errfile.log

To call from subprocess:

subprocess.call("1.py",shell=True) # no need to redirect stdout and stderr now

Post a Comment for "Python Output To Console Within Subprocess From The Child Scricpt"