diff options
author | Fredrik Lundh <fredrik@pythonware.com> | 2000-07-09 17:59:32 (GMT) |
---|---|---|
committer | Fredrik Lundh <fredrik@pythonware.com> | 2000-07-09 17:59:32 (GMT) |
commit | bb7eeff44a893f6d97f418e69c6387ac24b90a63 (patch) | |
tree | aaf15b9f5619995af43bb88359ee2551619d6f37 | |
parent | 766ccdcf18a8f31e1b23bcc4f3b34bcffe2e48d2 (diff) | |
download | cpython-bb7eeff44a893f6d97f418e69c6387ac24b90a63.zip cpython-bb7eeff44a893f6d97f418e69c6387ac24b90a63.tar.gz cpython-bb7eeff44a893f6d97f418e69c6387ac24b90a63.tar.bz2 |
- added popen.popen2/popen3/popen4 support for
windows.
- added optional mode argument to popen2/popen3
for unix; if the second argument is an integer,
it's assumed to be the buffer size.
- changed nt.popen2/popen3/popen4 return values
to match the popen2 module (stdout first, not
stdin).
-rw-r--r-- | Lib/popen2.py | 54 | ||||
-rw-r--r-- | Modules/posixmodule.c | 14 |
2 files changed, 46 insertions, 22 deletions
diff --git a/Lib/popen2.py b/Lib/popen2.py index eb8fb9a..73ff77c 100644 --- a/Lib/popen2.py +++ b/Lib/popen2.py @@ -89,31 +89,55 @@ class Popen3: _active.remove(self) return self.sts -def popen2(cmd, bufsize=-1): - """Execute the shell command 'cmd' in a sub-process. If 'bufsize' is - specified, it sets the buffer size for the I/O pipes. The file objects - (child_stdout, child_stdin) are returned.""" - _cleanup() - inst = Popen3(cmd, 0, bufsize) - return inst.fromchild, inst.tochild +try: + from os import popen2 +except NameError: + def popen2(cmd, mode='t', bufsize=-1): + """Execute the shell command 'cmd' in a sub-process. If 'bufsize' is + specified, it sets the buffer size for the I/O pipes. The file objects + (child_stdout, child_stdin) are returned.""" + if type(mode) is type(0) and bufsize == -1: + bufsize = mode + mode = 't' + assert mode in ('t', 'b') + _cleanup() + inst = Popen3(cmd, 0, bufsize) + return inst.fromchild, inst.tochild -def popen3(cmd, bufsize=-1): - """Execute the shell command 'cmd' in a sub-process. If 'bufsize' is - specified, it sets the buffer size for the I/O pipes. The file objects - (child_stdout, child_stdin, child_stderr) are returned.""" - _cleanup() - inst = Popen3(cmd, 1, bufsize) - return inst.fromchild, inst.tochild, inst.childerr +try: + from os import popen3 +except NameError: + def popen3(cmd, mode='t', bufsize=-1): + """Execute the shell command 'cmd' in a sub-process. If 'bufsize' is + specified, it sets the buffer size for the I/O pipes. The file objects + (child_stdout, child_stdin, child_stderr) are returned.""" + if type(mode) is type(0) and bufsize == -1: + bufsize = mode + mode = 't' + assert mode in ('t', 'b') + _cleanup() + inst = Popen3(cmd, 1, bufsize) + return inst.fromchild, inst.tochild, inst.childerr + +try: + from os import popen4 +except NameError: + pass # not on unix def _test(): teststr = "abc\n" print "testing popen2..." r, w = popen2('cat') + print r, w w.write(teststr) w.close() assert r.read() == teststr print "testing popen3..." - r, w, e = popen3(['cat']) + try: + r, w, e = popen3(['cat']) + except: + r, w, e = popen3('cat') + print r, w, e w.write(teststr) w.close() assert r.read() == teststr diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 4d40c07..8ea404e 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -2149,12 +2149,12 @@ static PyObject *_PyPopen(char *, int, int); static PyObject * posix_popen(PyObject *self, PyObject *args) { - int bufsize = -1; PyObject *f, *s; int tm = 0; char *cmdstring; char *mode = "r"; + int bufsize = -1; if (!PyArg_ParseTuple(args, "s|si:popen", &cmdstring, &mode, &bufsize)) return NULL; @@ -2174,9 +2174,9 @@ posix_popen(PyObject *self, PyObject *args) } if (*(mode+1) == 't') - f = _PyPopen(cmdstring, tm | _O_TEXT , POPEN_1); + f = _PyPopen(cmdstring, tm | _O_TEXT, POPEN_1); else if (*(mode+1) == 'b') - f = _PyPopen(cmdstring, tm | _O_BINARY , POPEN_1); + f = _PyPopen(cmdstring, tm | _O_BINARY, POPEN_1); else f = _PyPopen(cmdstring, tm | _O_TEXT, POPEN_1); @@ -2221,9 +2221,9 @@ win32_popen2(PyObject *self, PyObject *args) /* * Variation on <om win32pipe.popen> + * * The result of this function is 3 pipes - the process's stdin, * stdout and stderr - * */ static PyObject * @@ -2288,7 +2288,7 @@ win32_popen4(PyObject *self, PyObject *args) return NULL; } - f = _PyPopen(cmdstring, tm , POPEN_4); + f = _PyPopen(cmdstring, tm, POPEN_4); return f; } @@ -2516,7 +2516,7 @@ _PyPopen(char *cmdstring, int mode, int n) if (n != 4) CloseHandle(hChildStderrRdDup); - f = Py_BuildValue("OO",p1,p2); + f = Py_BuildValue("OO",p2,p1); break; } @@ -2545,7 +2545,7 @@ _PyPopen(char *cmdstring, int mode, int n) PyFile_SetBufSize(p1, 0); PyFile_SetBufSize(p2, 0); PyFile_SetBufSize(p3, 0); - f = Py_BuildValue("OOO",p1,p2,p3); + f = Py_BuildValue("OOO",p2,p1,p3); break; } } |