fix reduce
[PyX.git] / pycompat.py
blob21b0342f83bbf10362eda0acf00b3f058d83b2a5
1 # -*- encoding: utf-8 -*-
4 # Copyright (C) 2011-2012 Jörg Lehmann <joergl@users.sourceforge.net>
5 # Copyright (C) 2011-2012 André Wobst <wobsta@users.sourceforge.net>
7 # This file is part of PyX (http://pyx.sourceforge.net/).
9 # PyX is free software; you can redistribute it and/or modify
10 # it under the terms of the GNU General Public License as published by
11 # the Free Software Foundation; either version 2 of the License, or
12 # (at your option) any later version.
14 # PyX is distributed in the hope that it will be useful,
15 # but WITHOUT ANY WARRANTY; without even the implied warranty of
16 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 # GNU General Public License for more details.
19 # You should have received a copy of the GNU General Public License
20 # along with PyX; if not, write to the Free Software
21 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
23 import subprocess
25 class _marker: pass
28 class wait_pipe:
30 def __init__(self, pipe, wait):
31 self.pipe = pipe
32 self.wait = wait
34 def write(self, str):
35 self.pipe.write(str)
37 def close(self):
38 self.pipe.close()
39 self.wait()
42 def popen(cmd, mode="r", bufsize=_marker):
43 if mode[0] not in "rw" or "r" in mode[1:] or "w" in mode[1:]:
44 raise ValueError("read or write mode expected")
45 if mode[0] == "r":
46 kwargs = {"stdout": subprocess.PIPE}
47 else:
48 kwargs = {"stdin": subprocess.PIPE}
49 if bufsize is not _marker:
50 kwargs["bufsize"] = bufsize
51 pipes = subprocess.Popen(cmd, shell=True, **kwargs)
52 if mode[0] == "r":
53 return pipes.stdout
54 else:
55 return wait_pipe(pipes.stdin, pipes.wait)
57 def popen2(cmd, mode="t", bufsize=_marker):
58 kwargs = {"stdin": subprocess.PIPE,
59 "stdout": subprocess.PIPE}
60 if bufsize is not _marker:
61 kwargs["bufsize"] = bufsize
62 pipes = subprocess.Popen(cmd, shell=True, **kwargs)
63 return pipes.stdin, pipes.stdout
65 def popen4(cmd, mode="t", bufsize=_marker):
66 kwargs = {"stdin": subprocess.PIPE,
67 "stdout": subprocess.PIPE,
68 "stderr": subprocess.STDOUT}
69 if bufsize is not _marker:
70 kwargs["bufsize"] = bufsize
71 pipes = subprocess.Popen(cmd, shell=True, **kwargs)
72 return pipes.stdin, pipes.stdout