Reputation: 89
Say, I have command line utility, where output file is mandatory argument:
process_data <output file>
What I want is to be able to run this CMD command from Python code, but instead of storing result to file store it into Python variable (kinda redirect it):
variable = None # currently empty
os.system(f"process_data {variable}")
By the end of the utility runtime I wish to get content into that variable, that was supposed to be written to the "output file":
print("output: ", variable)
output: "Data is processed successfully, here is the content of processing: ..."
Upvotes: 0
Views: 179
Reputation: 613
Solution is here:
variable = None
response = subprocess.run(["process_data", "/dev/stdout"], capture_output=True)
variable = response.stdout
In case of text output I'd recommend to add "text=True" flag:
response = subprocess.run(["process_data", "/dev/stdout"], capture_output=True, text=True)
It is good to have a "timeout=..." flag, in case your cmd is hung:
response = subprocess.run(["process_data", "/dev/stdout"], capture_output=True, text=True, timeout=10)
Don't forget to always check on:
if response.returncode != 0:
# do something :)
Upvotes: 1
Reputation: 31
A cleaner way to call an external program is to use python subprocess
module. And you have two main way of using it.
import subprocess
variable = None
subprocess.call(["process_data", variable])
The output will be printed in stdout but you will not get it in a python variable.
However you can also specify not to show the output to the user using additional arguments.
import subprocess
variable = None
out = subprocess.check_output(["process_data", variable])
EDIT: in my example, variable is an argument to process_data
, not the variable to store the output in
Upvotes: 2