fix epsfile processPDF raise condition: popen(..., mode="w") must wait for the subpro...
[PyX/mjg.git] / pyx / pycompat.py
blob95432b7ffa0ace6ce3ab9611a43a43830c1ecffa
1 # -*- encoding: utf-8 -*-
4 # Copyright (C) 2011 Jörg Lehmann <joergl@users.sourceforge.net>
5 # Copyright (C) 2011 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 class _marker: pass
26 class wait_pipe:
28 def __init__(self, pipe, wait):
29 self.pipe = pipe
30 self.wait = wait
32 def write(self, str):
33 self.pipe.write(str)
35 def close(self):
36 self.pipe.close()
37 self.wait()
40 def popen(cmd, mode="r", bufsize=_marker):
41 try:
42 import subprocess
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)
56 except ImportError:
57 import os
58 if bufsize is _marker:
59 return os.popen(cmd, mode)
60 else:
61 return os.popen(cmd, mode, bufsize)
63 try:
64 any = any
65 except NameError:
66 def any(iterable):
67 for element in iterable:
68 if element:
69 return True
70 return False
72 try:
73 set = set
74 except NameError:
75 # Python 2.3
76 from sets import Set as set