[Tutor] pipes and redirecting

Adam Gold awg1 at gmx.com
Wed May 28 14:42:11 CEST 2014


> On 27/05/14 21:01, Adam Gold wrote:
> 
>> "dd if=/home/adam/1 bs=4k conv=noerror,notrunc,sync | pbzip2 > 1.img.bz2"
>>
>> The first thing I do is break it into two assignments
> 
> And that's the start of the problem because it should be three:
> The first command, the second command and the output file.
> 
>> ddIf = shlex.split("dd if=/home/adam/1 bs=4k conv=noerror,notrunc,sync")
>> compress = shlex.split("pbzip2 > /home/adam/1.img.bz2")
> 
> compress = "pbzip2"
> outfile = open('/home/adam/1.img.bz2','w')
> 
> The redirection symbol is not something subprocess can
> use as an argument.
> 
>> p1 = subprocess.Popen(ddIf, stdout=subprocess.PIPE)
>> p2 = subprocess.Popen(compress, stdin=p1.stdout, stdout=subprocess.PIPE)
> 
> Use the output file here.
> 
> p2 = subprocess.Popen(compress, stdin=p1.stdout, stdout=outfile)
> 
> 
>> I think that the '>' redirect needs to be dealt with using the
>> subprocess module as well but I can't quite put the pieces together.
>> I'd appreciate any guidance.  Thanks.
> 
> Alternatively read the output into a variable using communicate but then
> write it out to the file manually at the end.
> 
> [You might also be able to use shell=TRUE but that introduces other
> issues. But I don't know whether using shell includes redirection.]
> 
Thanks Alan, yes, I realise now I needed a third assignment to make this
work.

I actually had an exchange with subscriber 'eryksun' yesterday who did a
great job of pointing me in the right direction.  As a bit of a noob, I
think I replied to the individual rather than the list, hence it doesn't
seem to be in the thread.  For the benefit of the archives I append
below eryksun's initial (there was a bit of follow up but nothing too
important) reply to me.
=====================================

Send p2's stdout to a file:

    import subprocess
    import shlex

    ddIf = shlex.split("dd if=/home/adam/1 bs=4k "
                       "conv=noerror,notrunc,sync")
    compress = "pbzip2"
    filename = "/home/adam/1.img.bz2"

    p1 = subprocess.Popen(ddIf, stdout=subprocess.PIPE)
    with p1.stdout as fin, open(filename, "w") as fout:
        p2 = subprocess.Popen(compress, stdin=fin, stdout=fout)

    ret1 = p1.wait()
    ret2 = p2.wait()

Does this work?



More information about the Tutor mailing list