How do I pass a string into subprocess.Popen in Python 2? [duplicate]
Question
This question already has an answer here:
I would like to run a process from Python (2.4/2.5/2.6) using Popen
, and I
would like to give it a string as its standard input.
I'll write an example where the process does a "head -n 1" its input.
The following works, but I would like to solve it in a nicer way, without using
echo
:
>>> from subprocess import *
>>> p1 = Popen(["echo", "first line\nsecond line"], stdout=PIPE)
>>> Popen(["head", "-n", "1"], stdin=p1.stdout)
first line
I tried to use StringIO
, but it does not work:
>>> from StringIO import StringIO
>>> Popen(["head", "-n", "1"], stdin=StringIO("first line\nsecond line"))
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "/usr/lib/python2.4/subprocess.py", line 533, in __init__
(p2cread, p2cwrite,
File "/usr/lib/python2.4/subprocess.py", line 830, in _get_handles
p2cread = stdin.fileno()
AttributeError: StringIO instance has no attribute 'fileno'
I guess I could make a temporary file and write the string there -- but that's not very nice either.
Solution
Have you tried to feed your string to communicate as a string?
Popen.communicate(input=my_input)
It works like this:
p = subprocess.Popen(["head", "-n", "1"], stdin=subprocess.PIPE)
p.communicate('first\nsecond')
output:
first
I forgot to set stdin to subprocess.PIPE when I tried it at first.
OTHER TIPS
Use os.pipe:
>>> from subprocess import Popen
>>> import os, sys
>>> read, write = os.pipe()
>>> p = Popen(["head", "-n", "1"], stdin=read, stdout=sys.stdout)
>>> byteswritten = os.write(write, "foo bar\n")
foo bar
>>>
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow