8
votes

I'm trying to capture the output here. If, at the python prompt, I run

p = subprocess.Popen(["/path/to/search_by_hash.par", hash_str], 
                      stdout=subprocess.PIPE)

The return value (a list) prints to stdout, but isn't captured

[4460475, 4406612, 4379510]

I've tried following it up with

value = p.communicate()[0]
value

..but value is an empty string, not the list of ints I was expecting, and which is being printed to stdout

I experimented with the solutions from Store output of subprocess.Popen call in a string but haven't been able to capture the output.

UPDATE:

stderr doesn't seem to yield anything either...and the list I'm looking for is being printed out...just not having any luck in capturing it. See below:

>>> p = subprocess.Popen(["/home/jfry/tools/search_by_hash.par", hash_str], 
                          stdout=subprocess.PIPE)
>>> 
[4460475, 4406612, 4379510]
    value, err  = p.communicate()
>>> value
''
>>> err

Thanks!

3
Try value = p.communicate()[0] - Jakob Bowyer
Are you trying to capture the data being sent to the subprocess's stdout, or are you trying to capture the subprocess's exit status? - Adam Rosenfield
Jakob - thanks, that was a typo in my question, but not at the prompt. I've changed the question. - Jeff Fry
Adam - I want the return value, in this case a list of ints, e.g. [4460475, 4406612, 4379510] - Jeff Fry
add stderr=subprocess.PIPE, just like you already have for stdout - snapshoe

3 Answers

5
votes

Try checking stderr with p.communicate()[1].

5
votes

Because the accepted answer does not solve the issue (at least for me):

To capture the stderr-output, the following should be done:

import subprocess
p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)        
output, err = p.communicate()

The crucial part is the parameter stderr=subprocess.PIPE, without this parameter the stderr-output will not be captured and err will be None.

If you are interested only in the stderr-output you actually may use:

p = subprocess.Popen(command, stderr=subprocess.PIPE)        
err = p.communicate()[1]

In this case p.communicate()[0] is None.

1
votes

communicate is a method. So you should call it!

out = p.communicate()