diff --git a/src_c/rwobject.c b/src_c/rwobject.c index 2cd87171f4..d4d4a35644 100644 --- a/src_c/rwobject.c +++ b/src_c/rwobject.c @@ -46,6 +46,8 @@ typedef struct { static const char pg_default_encoding[] = "unicode_escape"; static const char pg_default_errors[] = "backslashreplace"; +static PyObject* os_module = NULL; + #define PATHLIB "pathlib" #define PUREPATH "PurePath" @@ -769,9 +771,51 @@ _rwops_from_pystr(PyObject *obj) } else { #if PY3 if (PyUnicode_Check(obj)) { - SDL_ClearError(); - PyErr_SetString(PyExc_FileNotFoundError, - "No such file or directory."); + SDL_ClearError(); + + if (os_module) { + PyObject* cwd = PyObject_CallMethod(os_module, "getcwd", + NULL); + if (cwd == NULL) { + PyErr_SetString(PyExc_FileNotFoundError, + "No such file or directory."); + return NULL; + } + + PyObject* path = PyObject_GetAttrString(os_module, "path"); + if (path == NULL) { + Py_DECREF(cwd); + PyErr_SetString(PyExc_FileNotFoundError, + "No such file or directory."); + return NULL; + } + + PyObject* isabs = PyObject_CallMethod(path, "isabs", "O", obj); + if (isabs == NULL) { + Py_DECREF(cwd); + Py_DECREF(path); + PyErr_SetString(PyExc_FileNotFoundError, + "No such file or directory."); + return NULL; + } + + if (isabs == Py_False) { + PyErr_Format(PyExc_FileNotFoundError, + "No file '%S' found in working directory" + " '%S'.", obj, cwd); + } + else { + PyErr_Format(PyExc_FileNotFoundError, + "No such file or directory: '%S'.", obj); + } + Py_DECREF(cwd); + Py_DECREF(path); + Py_DECREF(isabs); + } + else { + PyErr_Format(PyExc_FileNotFoundError, + "No such file or directory: '%S'.", obj); + } #else if (PyUnicode_Check(obj) || PyString_Check(obj)) { SDL_ClearError(); @@ -896,5 +940,11 @@ MODINIT_DEFINE(rwobject) DECREF_MOD(module); MODINIT_ERROR; } + + /* import os, don't sweat if it errors, it will be checked before use */ + os_module = PyImport_ImportModule("os"); + if (os_module == NULL) + PyErr_Clear(); + MODINIT_RETURN(module); }