Author: Tobias Pape <[email protected]>
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
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit