Merged revisions 76723 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/py3k

........
  r76723 | antoine.pitrou | 2009-12-09 01:01:27 +0100 (mer., 09 déc. 2009) | 3 lines

  Issue #7461: objects returned by os.popen() should support the context manager protocol
........
diff --git a/Lib/os.py b/Lib/os.py
index a59c5df..7c342fe 100644
--- a/Lib/os.py
+++ b/Lib/os.py
@@ -650,6 +650,10 @@
             return returncode
         else:
             return returncode << 8  # Shift left to match old behavior
+    def __enter__(self):
+        return self
+    def __exit__(self, *args):
+        self.close()
     def __getattr__(self, name):
         return getattr(self._stream, name)
     def __iter__(self):
diff --git a/Lib/test/test_popen.py b/Lib/test/test_popen.py
index 99ad41d..24fb846 100644
--- a/Lib/test/test_popen.py
+++ b/Lib/test/test_popen.py
@@ -49,6 +49,14 @@
         else:
             self.assertEqual(os.popen("exit 42").close(), 42 << 8)
 
+    def test_contextmanager(self):
+        with os.popen("echo hello") as f:
+            self.assertEqual(f.read(), "hello\n")
+
+    def test_iterating(self):
+        with os.popen("echo hello") as f:
+            self.assertEqual(list(f), ["hello\n"])
+
 def test_main():
     support.run_unittest(PopenTest)