diff options
author | Pauli Virtanen <pav@iki.fi> | 2010-02-20 18:06:00 +0000 |
---|---|---|
committer | Pauli Virtanen <pav@iki.fi> | 2010-02-20 18:06:00 +0000 |
commit | fdf9d7fa476c4717028ea424b0a96fc027dc9971 (patch) | |
tree | 1ec4f397f2470c0a9b5d1cf7bfefe38f4761cf94 | |
parent | 87cf71e97cc256fb6e86c921c0c5d6c54a037910 (diff) | |
download | numpy-fdf9d7fa476c4717028ea424b0a96fc027dc9971.tar.gz |
3K: BUG: fix tofile/fromfile on Py3 by dup-ing the file descriptor before fdopening -- works around issues in flushing data
-rw-r--r-- | numpy/core/src/multiarray/methods.c | 9 | ||||
-rw-r--r-- | numpy/core/src/multiarray/multiarraymodule.c | 9 | ||||
-rw-r--r-- | numpy/core/src/private/npy_3kcompat.h | 21 |
3 files changed, 31 insertions, 8 deletions
diff --git a/numpy/core/src/multiarray/methods.c b/numpy/core/src/multiarray/methods.c index 10b3cc6ee..b2600e962 100644 --- a/numpy/core/src/multiarray/methods.c +++ b/numpy/core/src/multiarray/methods.c @@ -498,7 +498,11 @@ array_tofile(PyArrayObject *self, PyObject *args, PyObject *kwds) else { Py_INCREF(file); } - fd = npy_PyFile_AsFile(file, "wb"); +#if defined(NPY_PY3K) + fd = npy_PyFile_Dup(file, "wb"); +#else + fd = PyFile_AsFile(file); +#endif if (fd == NULL) { PyErr_SetString(PyExc_IOError, "first argument must be a " \ "string or open file"); @@ -506,6 +510,9 @@ array_tofile(PyArrayObject *self, PyObject *args, PyObject *kwds) return NULL; } ret = PyArray_ToFile(self, fd, sep, format); +#if defined(NPY_PY3K) + fclose(fd); +#endif Py_DECREF(file); if (ret < 0) { return NULL; diff --git a/numpy/core/src/multiarray/multiarraymodule.c b/numpy/core/src/multiarray/multiarraymodule.c index c89eade0d..5b8420656 100644 --- a/numpy/core/src/multiarray/multiarraymodule.c +++ b/numpy/core/src/multiarray/multiarraymodule.c @@ -1723,7 +1723,11 @@ array_fromfile(PyObject *NPY_UNUSED(ignored), PyObject *args, PyObject *keywds) else { Py_INCREF(file); } - fp = npy_PyFile_AsFile(file, "rb"); +#if defined(NPY_PY3K) + fp = npy_PyFile_Dup(file, "rb"); +#else + fp = PyFile_AsFile(file); +#endif if (fp == NULL) { PyErr_SetString(PyExc_IOError, "first argument must be an open file"); @@ -1734,6 +1738,9 @@ array_fromfile(PyObject *NPY_UNUSED(ignored), PyObject *args, PyObject *keywds) type = PyArray_DescrFromType(PyArray_DEFAULT); } ret = PyArray_FromFile(fp, type, (intp) nin, sep); +#if defined(NPY_PY3K) + fclose(fp); +#endif Py_DECREF(file); return ret; } diff --git a/numpy/core/src/private/npy_3kcompat.h b/numpy/core/src/private/npy_3kcompat.h index b2d085d2f..b7df15294 100644 --- a/numpy/core/src/private/npy_3kcompat.h +++ b/numpy/core/src/private/npy_3kcompat.h @@ -134,18 +134,27 @@ PyUnicode_Concat2(PyObject **left, PyObject *right) */ #if defined(NPY_PY3K) static NPY_INLINE FILE* -npy_PyFile_AsFile(PyObject *file, char *mode) +npy_PyFile_Dup(PyObject *file, char *mode) { - int fd; + int fd, fd2; + PyObject *ret, *os; fd = PyObject_AsFileDescriptor(file); if (fd == -1) { return NULL; } -#warning XXX -- who releases the FILE* returned by fdopen? fclose() closes the file... - return fdopen(fd, mode); + os = PyImport_ImportModule("os"); + if (os == NULL) { + return NULL; + } + ret = PyObject_CallMethod(os, "dup", "i", fd); + Py_DECREF(os); + if (ret == NULL) { + return NULL; + } + fd2 = PyNumber_AsSsize_t(ret, NULL); + Py_DECREF(ret); + return fdopen(fd2, mode); } -#else -#define npy_PyFile_AsFile(file, mode) PyFile_AsFile(file) #endif static NPY_INLINE PyObject* |