summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/popen2.py54
-rw-r--r--Modules/posixmodule.c14
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;
}
}