From e686ae714a6ba436912a2ce7ea2da615a8d5d0bf Mon Sep 17 00:00:00 2001 From: David Lord Date: Wed, 10 Jul 2019 13:48:08 -0700 Subject: [PATCH] work around issue using pydevd with the reloader --- CHANGES.rst | 4 +++- src/werkzeug/_reloader.py | 17 ++++++++++++----- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index d29e0daae..ada5e43d9 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -13,7 +13,9 @@ Unreleased message to the description if ``e.show_exception`` is set to ``True``. This is a more secure default than the original 0.15.0 behavior and makes it easier to control without losing information. - (:pr:`1592`) + :pr:`1592` +- Work around an issue in some external debuggers that caused the + reloader to fail. :issue:`1607` Version 0.15.4 diff --git a/src/werkzeug/_reloader.py b/src/werkzeug/_reloader.py index f06a63d5f..8d22859d5 100644 --- a/src/werkzeug/_reloader.py +++ b/src/werkzeug/_reloader.py @@ -68,13 +68,15 @@ def _get_args_for_reloading(): a program other than python) """ rv = [sys.executable] - py_script = os.path.abspath(sys.argv[0]) + py_script = sys.argv[0] args = sys.argv[1:] # Need to look at main module to determine how it was executed. __main__ = sys.modules["__main__"] if __main__.__package__ is None: # Executed a file, like "python app.py". + py_script = os.path.abspath(py_script) + if os.name == "nt": # Windows entry points have ".exe" extension and should be # called directly. @@ -101,11 +103,16 @@ def _get_args_for_reloading(): # TODO remove this once Flask no longer misbehaves args = sys.argv else: - py_module = __main__.__package__ - name = os.path.splitext(os.path.basename(py_script))[0] + if os.path.isfile(py_script): + # Rewritten by Python from "-m script" to "/path/to/script.py". + py_module = __main__.__package__ + name = os.path.splitext(os.path.basename(py_script))[0] - if name != "__main__": - py_module += "." + name + if name != "__main__": + py_module += "." + name + else: + # Incorrectly rewritten by pydevd debugger from "-m script" to "script". + py_module = py_script rv.extend(("-m", py_module.lstrip(".")))