The docs for the subprocess.Popen() say:

        Use communicate() rather than .stdin.write, .stdout.read
        or .stderr.read to avoid deadlocks due to any of the other
        OS pipe buffers filling up and blocking the child process

But if I want to send a string to stdin, how can I do that without
stdin.write()?

This seems to work:

import subprocess as s

thing = """
        hey
        there
        foo man is here
        hey foo
        man is there
        so foo
"""
p = s.Popen(['grep', 'foo'], stdin = s.PIPE, stdout = s.PIPE)
p.stdin.write(thing)
print p.communicate()

######################

('\they foo\n \tfoo there\n', None)


Will this always avoid the deadlock problem?

This also works:

p = s.Popen(['grep', 'foo'], stdin = s.PIPE, stdout = s.PIPE)
p.stdin.write(thing)
p.stdin.close()
print p.stdout.read()

Is that vulnerable to deadlock?  Is there a better way
to write to and read from the same process?

Thanks!

Tobiah
--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to