Search code examples
pythoniosubprocess

Reading output from terminal using subprocess.run


I'm writing a python string to parse a value from a JSON file, run a tool called Googler with a couple of arguments including the value from the JSON file, and then save the output of the tool to a file (CSV preferred, but that's for another day).

So far the code is:

import json
import os
import subprocess
import time

with open("test.json") as json_file:
    json_data = json.load(json_file)
    test = (json_data["search_term1"]["apparel"]["biba"])

#os.system("googler -N -t d1 "+test)  shows the output, but can't write to a file.

result= subprocess.run(["googler", "-N","-t","d1",test], stdout=subprocess.PIPE, universal_newlines=True)
print(result.stdout)

When I run the above script, nothing happens, the terminal just sits blank until I send a keyboard interrupt and then I get this error:

Traceback (most recent call last):
  File "script.py", line 12, in <module>
    result= subprocess.run(["googler", "-N","-t","d1",test], stdout=subprocess.PIPE, universal_newlines=True)
  File "/usr/lib/python3.5/subprocess.py", line 695, in run
    stdout, stderr = process.communicate(input, timeout=timeout)
  File "/usr/lib/python3.5/subprocess.py", line 1059, in communicate
    stdout = self.stdout.read()
KeyboardInterrupt

I tried replacing the test variable with a string, same error. The same line works on something like "ls", "-l", "/dev/null".

How do I extract the output of this tool and write it to a file?


Solution

  • Your googler command works in interactive mode. It never exits, so your program is stuck.

    You want googler to run the search, print the output and then exit.

    From the docs, I think --np (or --noprompt) is the right parameter for that. I didn't test.

    result = subprocess.run(["googler", "-N", "-t", "d1", "--np", test], stdout=subprocess.PIPE, universal_newlines=True)