Using && in subprocess.Popen for command chaining?

chaining, linux, popen, python, python-2.7

Solution

`&&` is a shell operator, `Popen` does not use a shell by default.

If you want to use shell functionality use `shell=True` in your `Popen` call, but be aware that it is slightly slower/more memory intensive.

p1 = subprocess.Popen(["mmls", "WinXP.E01", "&&", "echo", "-e", "\"\n\"", "&&", "stat", "WinXP.E01"],
                      stdout=subprocess.PIPE, shell=True)

Problem

I'm using `subprocess.Popen` with `Python`, and I haven't come across an elegant solution for joining commands (i.e. foobar`&&` bizbang) via `Popen`. I could do this: ``` p1 = subprocess.Popen(["mmls", "WinXP.E01"], stdout=subprocess.PIPE) result = p1.communicate()[0].split("\n") for line in result: script_log.write(line) script_log.write("\n") p1 = subprocess.Popen(["stat", "WinXP.E01"], stdout=subprocess.PIPE) result = p1.communicate()[0].split("\n") for line in result: script_log.write(line) ``` But that really isn't very aesthetically pleasing (especially if I'm daisy-chaining multiple commands via `Popen`. I'd like to replicate this output in as few command blocks as possible. ``` not@work ~/ESI/lab3/images $ mmls WinXP.E01 && echo -e "\n" && stat WinXP.E01 DOS Partition Table Offset Sector: 0 Units are in 512-byte sectors Slot Start End Length Description 00: Meta 0000000000 0000000000 0000000001 Primary Table (#0) 01: ----- 0000000000 0000000062 0000000063 Unallocated 02: 00:00 0000000063 0020948759 0020948697 NTFS (0x07) 03: ----- 0020948760 0020971519 0000022760 Unallocated File: `WinXP.E01' Size: 4665518381 Blocks: 9112368 IO Block: 4096 regular file Device: 14h/20d Inode: 4195953 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 1000/ nott) Gid: ( 1000/ nott) Access: 2013-03-16 23:20:41.901326579 -0400 Modify: 2013-03-04 10:05:50.000000000 -0500 Change: 2013-03-13 00:25:33.254684050 -0400 Birth: - ``` Any suggestions? Note: I'd like to avoid typing this into `subprocess.Popen` ``` p1 = subprocess.Popen(["mmls WinXP.E01 && echo -e '\n' && stat WinXP.E01"], stdout=subprocess.PIPE) ```

Original source

Related problems