mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
Added os.popen2() and os.popen3() for non-Windows platforms.
This commit is contained in:
parent
e67d8e514f
commit
31f182e830
4 changed files with 57 additions and 4 deletions
13
Lib/os.py
13
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)
|
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
|
||||||
|
|
|
@ -89,7 +89,8 @@ class Popen3:
|
||||||
_active.remove(self)
|
_active.remove(self)
|
||||||
return self.sts
|
return self.sts
|
||||||
|
|
||||||
if hasattr(os, "popen2"):
|
|
||||||
|
if sys.platform[:3] == "win":
|
||||||
def popen2(cmd, mode='t', bufsize=-1):
|
def popen2(cmd, mode='t', bufsize=-1):
|
||||||
"""Execute the shell command 'cmd' in a sub-process. If 'bufsize' is
|
"""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
|
specified, it sets the buffer size for the I/O pipes. The file objects
|
||||||
|
@ -109,7 +110,7 @@ else:
|
||||||
inst = Popen3(cmd, 0, bufsize)
|
inst = Popen3(cmd, 0, bufsize)
|
||||||
return inst.fromchild, inst.tochild
|
return inst.fromchild, inst.tochild
|
||||||
|
|
||||||
if hasattr(os, "popen3"):
|
if sys.platform[:3] == "win":
|
||||||
def popen3(cmd, mode='t', bufsize=-1):
|
def popen3(cmd, mode='t', bufsize=-1):
|
||||||
"""Execute the shell command 'cmd' in a sub-process. If 'bufsize' is
|
"""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
|
specified, it sets the buffer size for the I/O pipes. The file objects
|
||||||
|
@ -129,7 +130,7 @@ else:
|
||||||
inst = Popen3(cmd, 1, bufsize)
|
inst = Popen3(cmd, 1, bufsize)
|
||||||
return inst.fromchild, inst.tochild, inst.childerr
|
return inst.fromchild, inst.tochild, inst.childerr
|
||||||
|
|
||||||
if hasattr(os, "popen4"):
|
if sys.platform[:3] == "win":
|
||||||
def popen4(cmd, mode='t', bufsize=-1):
|
def popen4(cmd, mode='t', bufsize=-1):
|
||||||
"""Execute the shell command 'cmd' in a sub-process. If 'bufsize' is
|
"""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
|
specified, it sets the buffer size for the I/O pipes. The file objects
|
||||||
|
@ -139,6 +140,7 @@ if hasattr(os, "popen4"):
|
||||||
else:
|
else:
|
||||||
pass # not yet on unix
|
pass # not yet on unix
|
||||||
|
|
||||||
|
|
||||||
def _test():
|
def _test():
|
||||||
cmd = "cat"
|
cmd = "cat"
|
||||||
teststr = "abc\n"
|
teststr = "abc\n"
|
||||||
|
|
|
@ -1,4 +1,9 @@
|
||||||
test_popen2
|
test_popen2
|
||||||
|
Test popen2 module:
|
||||||
|
testing popen2...
|
||||||
|
testing popen3...
|
||||||
|
All OK
|
||||||
|
Testing os module:
|
||||||
testing popen2...
|
testing popen2...
|
||||||
testing popen3...
|
testing popen3...
|
||||||
All OK
|
All OK
|
||||||
|
|
|
@ -3,12 +3,15 @@
|
||||||
Christian Tismer
|
Christian Tismer
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
# popen2 contains its own testing routine
|
# popen2 contains its own testing routine
|
||||||
# which is especially useful to see if open files
|
# which is especially useful to see if open files
|
||||||
# like stdin can be read successfully by a forked
|
# like stdin can be read successfully by a forked
|
||||||
# subprocess.
|
# subprocess.
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
|
print "Test popen2 module:"
|
||||||
try:
|
try:
|
||||||
from os import popen
|
from os import popen
|
||||||
except ImportError:
|
except ImportError:
|
||||||
|
@ -19,5 +22,35 @@ def main():
|
||||||
import popen2
|
import popen2
|
||||||
popen2._test()
|
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()
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue