do not keep filehandles around; instead use the same file open method at all places
[PyX.git] / pycompat.py
blob957bae8d82c9403e7995585bdb5f21abaf3dd7a7
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 def popen4(cmd, mode="t", bufsize=_marker):
64 try:
65 import subprocess
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
73 except ImportError:
74 import os
75 if bufsize is _marker:
76 return os.popen4(cmd, mode)
77 else:
78 return os.popen4(cmd, mode, bufsize)
80 try:
81 any = any
82 except NameError:
83 def any(iterable):
84 for element in iterable:
85 if element:
86 return True
87 return False
89 try:
90 set = set
91 except NameError:
92 # Python 2.3
93 from sets import Set as set