summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFred Drake <fdrake@acm.org>2000-08-28 17:20:05 (GMT)
committerFred Drake <fdrake@acm.org>2000-08-28 17:20:05 (GMT)
commit31f182e830db13c3edbe12e58f9c737cc21583fa (patch)
tree6138744d553c71b9eef48a43bc8a4ab201c5f9c3
parente67d8e514f7d7b49faec3e5a181c7019f07467ba (diff)
downloadcpython-31f182e830db13c3edbe12e58f9c737cc21583fa.zip
cpython-31f182e830db13c3edbe12e58f9c737cc21583fa.tar.gz
cpython-31f182e830db13c3edbe12e58f9c737cc21583fa.tar.bz2
Added os.popen2() and os.popen3() for non-Windows platforms.
-rw-r--r--Lib/os.py13
-rw-r--r--Lib/popen2.py8
-rw-r--r--Lib/test/output/test_popen25
-rw-r--r--Lib/test/test_popen2.py35
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()