From 31f182e830db13c3edbe12e58f9c737cc21583fa Mon Sep 17 00:00:00 2001 From: Fred Drake Date: Mon, 28 Aug 2000 17:20:05 +0000 Subject: Added os.popen2() and os.popen3() for non-Windows platforms. --- Lib/os.py | 13 +++++++++++++ Lib/popen2.py | 8 +++++--- Lib/test/output/test_popen2 | 5 +++++ Lib/test/test_popen2.py | 35 ++++++++++++++++++++++++++++++++++- 4 files changed, 57 insertions(+), 4 deletions(-) diff --git a/Lib/os.py b/Lib/os.py index 59c3895..c804c3a 100644 --- a/Lib/os.py +++ b/Lib/os.py @@ -454,3 +454,16 @@ otherwise return -SIG, where SIG is the signal that killed it. """ return spawnvpe(mode, file, args[:-1], env) +if not _exists("popen2"): + def popen2(cmd, mode="t", bufsize=-1): + assert mode[:1] in ("b", "t") + import popen2 + stdout, stdin = popen2.popen2(cmd, bufsize) + return stdin, stdout + +if not _exists("popen3"): + def popen3(cmd, mode="t", bufsize=-1): + assert mode[:1] in ("b", "t") + import popen2 + stdout, stdin, stderr = popen2.popen3(cmd, bufsize) + return stdin, stdout, stderr diff --git a/Lib/popen2.py b/Lib/popen2.py index 2fd9a19..e0f2880 100644 --- a/Lib/popen2.py +++ b/Lib/popen2.py @@ -89,7 +89,8 @@ class Popen3: _active.remove(self) return self.sts -if hasattr(os, "popen2"): + +if sys.platform[:3] == "win": 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 @@ -109,7 +110,7 @@ else: inst = Popen3(cmd, 0, bufsize) return inst.fromchild, inst.tochild -if hasattr(os, "popen3"): +if sys.platform[:3] == "win": 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 @@ -129,7 +130,7 @@ else: inst = Popen3(cmd, 1, bufsize) return inst.fromchild, inst.tochild, inst.childerr -if hasattr(os, "popen4"): +if sys.platform[:3] == "win": def popen4(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 @@ -139,6 +140,7 @@ if hasattr(os, "popen4"): else: pass # not yet on unix + def _test(): cmd = "cat" teststr = "abc\n" diff --git a/Lib/test/output/test_popen2 b/Lib/test/output/test_popen2 index 1fadf1b..a66cde9 100644 --- a/Lib/test/output/test_popen2 +++ b/Lib/test/output/test_popen2 @@ -1,4 +1,9 @@ test_popen2 +Test popen2 module: +testing popen2... +testing popen3... +All OK +Testing os module: testing popen2... testing popen3... All OK diff --git a/Lib/test/test_popen2.py b/Lib/test/test_popen2.py index f6359ce..26ef9d9 100644 --- a/Lib/test/test_popen2.py +++ b/Lib/test/test_popen2.py @@ -3,12 +3,15 @@ Christian Tismer """ +import os + # popen2 contains its own testing routine # which is especially useful to see if open files # like stdin can be read successfully by a forked # subprocess. def main(): + print "Test popen2 module:" try: from os import popen except ImportError: @@ -19,5 +22,35 @@ def main(): import popen2 popen2._test() -main() +def _test(): + # same test as popen2._test(), but using the os.popen*() API + print "Testing os module:" + import popen2 + cmd = "cat" + teststr = "abc\n" + resultstr = teststr + if os.name == "nt": + cmd = "more" + resultstr = "\n" + resultstr + print "testing popen2..." + w, r = os.popen2(cmd) + w.write(teststr) + w.close() + assert r.read() == resultstr + print "testing popen3..." + try: + w, r, e = os.popen3([cmd]) + except: + w, r, e = os.popen3(cmd) + w.write(teststr) + w.close() + assert r.read() == resultstr + assert e.read() == "" + for inst in popen2._active[:]: + inst.wait() + assert not popen2._active + print "All OK" + +main() +_test() -- cgit v0.12