In the Unix/Linux shell you can use backticks to capture the output of an external command. In Perl you can use both backticks and the qx operator.
In Python it requires a bit more code, but it is easy to wrap it in a function.
Basically this is it:
import subprocess
def qx(cmd):
return subprocess.check_output(cmd, shell=True)
External code
In order to show how it works I've created a program (that happens to be in Python, but could be in any language) that prints to both STDOUT and STDERR:
#!/usr/bin/env python
import sys
sys.stdout.write("Hello\n")
sys.stderr.write("Somthing to SDTERR\n")
sys.stdout.write("World\n")
If we run it we see the following on the screen:
Hello
Somthing to SDTERR
World
Capture using qx
examples/python/capture_stdout.py
import subprocess
def qx(cmd):
return subprocess.check_output(cmd, shell=True)
out = qx('./external.py')
print("=={}==".format(out))
This will capture everything printed to STDOUT by the external code and assign it to the "out" variable.
Whatever printed to STDERR will be let through to STDERR.
This is the output:
examples/python/capture_stdout.txt
Somthing to SDTERR
==Hello
World
==
This is a blocking operation so your Python code will wait till the external program finishes to run.
qxx - capture both stdout and stderr
import subprocess
def qxx(cmd):
proc = subprocess.Popen(cmd,
stdout = subprocess.PIPE,
stderr = subprocess.STDOUT,
shell = True,
)
stdout, stderr = proc.communicate()
if proc.returncode != 0:
raise Exception("Error executing {}".formart(cmd))
return stdout
See also
import subprocess
import sys
def run(cmd):
proc = subprocess.Popen(cmd,
stdout = subprocess.PIPE,
stderr = subprocess.PIPE,
)
stdout, stderr = proc.communicate()
return proc.returncode, stdout, stderr
code, out, err = run([sys.executable, 'examples/python/run.py'])
print("out: '{}'".format(out))
print("err: '{}'".format(err))
print("exit: {}".format(code))