Author: Tobias Pape <tob...@netshed.de>
Branch: popen-pclose
Changeset: r69706:58405322f403
Date: 2014-03-03 17:54 +0100
http://bitbucket.org/pypy/pypy/changeset/58405322f403/

Log:    Provide an exit status for popen'ed RFiles via pclose

diff --git a/rpython/rlib/rfile.py b/rpython/rlib/rfile.py
--- a/rpython/rlib/rfile.py
+++ b/rpython/rlib/rfile.py
@@ -116,7 +116,13 @@
             rffi.free_nonmovingbuffer(value, ll_value)
 
     def close(self):
+        """ Closes the described file.
+
+Attention! Unlike Python semantics, `close' does not return `None' upon
+success but `0', to be able to return an exit code for popen'ed files """
+
         ll_f = self.ll_file
+        res = 0
         if ll_f:
             # double close is allowed
             self.ll_file = lltype.nullptr(FILE)
@@ -124,6 +130,7 @@
             if res == -1:
                 errno = rposix.get_errno()
                 raise OSError(errno, os.strerror(errno))
+        return os.WEXITSTATUS(res)
 
     _do_close = staticmethod(c_close)    # overridden in RPopenFile
 
diff --git a/rpython/rlib/test/test_rfile.py b/rpython/rlib/test/test_rfile.py
--- a/rpython/rlib/test/test_rfile.py
+++ b/rpython/rlib/test/test_rfile.py
@@ -196,3 +196,14 @@
         s = f.read()
         f.close()
         assert s == '42\n'
+
+    def test_pclose(self):
+        retval = 32
+        printval = 42
+        cmd = "python -c 'import sys; print %s; sys.exit(%s)'" % (
+            printval, retval)
+        f = rfile.create_popen_file(cmd, "r")
+        s = f.read()
+        r = f.close()
+        assert s == "%s\n" % printval
+        assert r == retval
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to