]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
- added popen.popen2/popen3/popen4 support for
authorFredrik Lundh <fredrik@pythonware.com>
Sun, 9 Jul 2000 17:59:32 +0000 (17:59 +0000)
committerFredrik Lundh <fredrik@pythonware.com>
Sun, 9 Jul 2000 17:59:32 +0000 (17:59 +0000)
  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).

Lib/popen2.py
Modules/posixmodule.c

index eb8fb9ad1fcdf0b6a0a13ac5e644575aaf4b4163..73ff77c9516c46b913b4c854a49d943a9896b25c 100644 (file)
@@ -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
index 4d40c07eff3c6aacc5438ca3322fcea801125417..8ea404e579b27fb70a00d037f7fed9aeef391c8f 100644 (file)
@@ -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;
         }
         }