From 4c6bee3514679cde3b506d5552a3a11fd09cc6d5 Mon Sep 17 00:00:00 2001 From: Aaron Gokaslan Date: Thu, 9 Sep 2021 14:06:33 -0400 Subject: [PATCH] fix: Set __file__ constant when using eval_file (#1300) (#3233) * Set __file__ constant when using eval_file * Use const ref * Use a move instead * Revert * Improve test * Guard test with Python version * Fix tests * Dont support Python2 API * Drop Python2 eval __file__ support * Hack * Semisupport Python2 * Take2 * Remove Python2 support --- include/pybind11/eval.h | 9 +++++++++ tests/test_cmake_build/test.py | 3 +++ 2 files changed, 12 insertions(+) diff --git a/include/pybind11/eval.h b/include/pybind11/eval.h index 33fcdc09d..e0f58bcf4 100644 --- a/include/pybind11/eval.h +++ b/include/pybind11/eval.h @@ -136,6 +136,15 @@ object eval_file(str fname, object global = globals(), object local = object()) pybind11_fail("File \"" + fname_str + "\" could not be opened!"); } + // In Python2, this should be encoded by getfilesystemencoding. + // We don't boher setting it since Python2 is past EOL anyway. + // See PR#3233 +#if PY_VERSION_HEX >= 0x03000000 + if (!global.contains("__file__")) { + global["__file__"] = std::move(fname); + } +#endif + #if PY_VERSION_HEX < 0x03000000 && defined(PYPY_VERSION) PyObject *result = PyRun_File(f, fname_str.c_str(), start, global.ptr(), local.ptr()); diff --git a/tests/test_cmake_build/test.py b/tests/test_cmake_build/test.py index d1a290dcc..972a27bea 100644 --- a/tests/test_cmake_build/test.py +++ b/tests/test_cmake_build/test.py @@ -3,5 +3,8 @@ import sys import test_cmake_build +if str is not bytes: # If not Python2 + assert isinstance(__file__, str) # Test this is properly set + assert test_cmake_build.add(1, 2) == 3 print("{} imports, runs, and adds: 1 + 2 = 3".format(sys.argv[1]))