From 6ab6ced59198b316ed36d0c4eaf05ed59ff0a827 Mon Sep 17 00:00:00 2001 From: Doug Ransom Date: Thu, 22 Feb 2024 15:36:35 -0800 Subject: [PATCH] DAP Working (#67) * was lost in the flow, reentered from natlinkcore repository * entered getUnimacroGrammarsDirectory, and a lot of tidying up * multiple changes in natlinkstatus.py and natlinkconfigfunctions.py, letting eg unimacro setup be better add getUnimacroGrammarsDirectory * add 2 tests execscriptest.py is ok, buttonclicktest.py fails. The cause is playEvents. * the buttonclicktest.py shows the bug when natlink.playEvents is called. * also enter dragonfly (dragonfly2) in the config procedure, including testing for upgrades.. * add a few changes to nsformat.py (a\\determiner and I\\pronoun a word with \\ (properties) can also have length 2 when splitted into wordList. * small change in nsformat.py (formatPassword) * use pythong logging module to report output of pip etc. * command line uses logging. * logging to cli. * tweak. * updated * renamed * checkpoint * some updates on logging, debug startup * Removed documentation and obsolete natlinkpydebug.py. Start DAP in loader of configured in natlink.ini. --------- Co-authored-by: Quintijn Hoogenboom --- documentation/add_configuration.png | Bin 0 -> 24865 bytes documentation/developers.rst | 196 ---------------------------- documentation/run_and_debug.png | Bin 0 -> 26295 bytes pyproject.toml | 4 +- src/natlinkcore/loader.py | 82 ++++++++---- 5 files changed, 60 insertions(+), 222 deletions(-) create mode 100644 documentation/add_configuration.png delete mode 100644 documentation/developers.rst create mode 100644 documentation/run_and_debug.png diff --git a/documentation/add_configuration.png b/documentation/add_configuration.png new file mode 100644 index 0000000000000000000000000000000000000000..bb45bb8763c953be8e29e7384067675d99cac9e0 GIT binary patch literal 24865 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 - (Community Edition 2019 or above) with ``C++ Desktop Development`` - and ``Microsoft Visual C++ Redistributable``. - - - `C++ Desktop - Development `__ - This contains the necessary compilers for **(Visual Studio** and - **Visual Studio Code)** - - `Microsoft Visual C++ Redistributable 2015, 2017, 2019, and - 2022 `__ - (32-bit/X86 required) - -2. Install `Visual Studio Code `__ - with the following Extensions - - - `C/C++ `__ - - `CMake `__ - -3. Install `Inno `__ version 6.x. -4. Install `Python `__ version 3.8.x, - 3.9.x, or 3.10.x 32-bit/X86 (Does not need to be on path) -5. After cloning Nalink open the project up in Visual Studio Code - - - Set the Python Version ``PYTHON_VERSION 3.10`` in - `CMakeLists.txt `__ - (The CMakeLists.txt in top directory of the project) - - - example for Python 3.8.x - ``set(PYTHON_VERSION 3.8 CACHE STRING "3.X for X >= 8")`` - - - Selective equivalent to - ``Visual Studio Community 2022 Release - x86`` (32-bit/X86 - required) to configure the compiler. - - - |image1| - -6. The ``build`` directory will generate containing the configuration - selected and build artifacts (compiled code and installer) - - - The ``build`` directory can be safely deleted if you need to - reconfigure the project as it will just regenerate. - -7. Click the "build" button at the bottom of the editor to to build the - project and create the installer. - - - |image2| - - ``build`` directory Installer location - ``{project source directory}\build\InstallerSource\natlink5.1-py3.10-32-setup.exe`` - -.. |image1| image:: https://user-images.githubusercontent.com/24551569/164927468-68f101a5-9eed-4568-b251-0d09fde0394c.png -.. |image2| image:: https://user-images.githubusercontent.com/24551569/164919729-bd4b2096-6af3-4307-ba3c-ef6ff3b98c41.png - -Debugging Natlink Python Code ------------------- -Developers can debug their python natlink grammars or any -other Python code running in natlink using a debugger supporting -`Debug Adapter Protocol: https://microsoft.github.io/debug-adapter-protocol/`_ (DAP). - -To enable DAP, add or edit your natlink.ini to include this section. Change the port if you need to. -:: - [settings.debugadapterprotocol] - - dap_enabled = True - dap_port = 7474 - dap_wait_for_debugger_attach_on_startup = True - -You can `check if your favorite debugger supports DAP https://microsoft.github.io/debug-adapter-protocol/implementors/tools/. Here are instructions for Visual -Studio Code`_: - -Add this section to launch.json, ensuring the port number matchines natlink.ini, and noting -the pathMappings have been commented out: -:: - { - "name": "Natlink: Remote Attach", - "type": "python", - "request": "attach", - "connect": { - "host": "localhost", - "port": 7474 - }, - //DO NOT USE THE VISUAL STUDIO DEFAULTS - //FOR pathMappings. - //The defaults will not work and your breakpoints - //will never hit. So delete the pathMappings - //section for local host debugging, or set them to - //something meaningful. - // "pathMappings": [ - // { - // "localRoot": "${workspaceFolder}", - // "remoteRoot": "." - // } - - //a good idea to set justMyCode to false. Otherwise - //you may have breakpoints set that won't trigger. - "justMyCode": false - } - - -Further instructions --------------------- - - - - -Invalid options Visual Studio ------------------------------ - -When the C++ compile redistributale is wrongly configured, the program `dumpbinx.exe` reports a dependency, which is not wanted: - -:: - - PS C:\dt\NatlinkDoc\natlink\documentation> ."C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\bin\Hostx86\x86\dumpbin.exe" /DEPENDENTS "C:\Program Files (x86)\Natlink\site-packages\natlink\_natlink_core.pyd" - Microsoft (R) COFF/PE Dumper Version 14.29.30136.0 - Copyright (C) Microsoft Corporation. All rights reserved. - - - Dump of file C:\Program Files (x86)\Natlink\site-packages\natlink\_natlink_core.pyd - - File Type: DLL - - Image has the following dependencies: - - python38.dll - KERNEL32.dll - USER32.dll - SHELL32.dll - ole32.dll - OLEAUT32.dll - ADVAPI32.dll - MSVCP140D.dll - VCRUNTIME140D.dll - ucrtbased.dll - - (...) - -The `VCRUNTIME140D.dll` should not be there. - -Fix ---- - -Static linking is established by installing: -https://docs.microsoft.com/en-us/cpp/c-runtime-library/crt-library-features?view=msvc-170&viewFallbackFrom=vs-2019 - -Also see "Bundling vc redistributables": -https://stackoverflow.com/questions/24574035/how-to-install-microsoft-vc-redistributables-silently-in-inno-setup - - -With install version 5.1.1 (with python 3.8), now the following output is given: - -:: - - (Powershell) ."C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\bin\Hostx86\x86\dumpbin.exe" /DEPENDENTS "C:\Program Files (x86)\Natlink\site-packages\natlink\_natlink_core.pyd" - Dump of file C:\Program Files (x86)\Natlink\site-packages\natlink\_natlink_core.pyd - - File Type: DLL - - Image has the following dependencies: - - python38.dll - KERNEL32.dll - USER32.dll - SHELL32.dll - ole32.dll - OLEAUT32.dll - ADVAPI32.dll - (...) - - -So issue#86(https://github.com/dictation-toolbox/natlink/issues/86) is hopefully solved and explained with this all. - - -.. _issue#86: https://github.com/dictation-toolbox/natlink/issues/86 - diff --git a/documentation/run_and_debug.png b/documentation/run_and_debug.png new file mode 100644 index 0000000000000000000000000000000000000000..e22d03ef8d7c0d54f22b5dbf459ad9cee4fe24a3 GIT binary patch literal 26295 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 literal 0 HcmV?d00001 diff --git a/pyproject.toml b/pyproject.toml index 0a7c749..4cec6d8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,7 +11,7 @@ readme = "readme.md" dependencies= [ "natlink>=5.3.4", "pysimplegui>=4.60.3", - "pydebugstring", + "pydebugstring >= 1.0.0.1", "dtactions>=1.5.7", "platformdirs >= 4.2.0" ] @@ -30,7 +30,7 @@ test = [ "pytest >=7.1.2", ] dev = [ - "pyenvutils","entry-point-inspector" + "pyenvutils","entry-point-inspector","build" ] [tool.pytest.ini_options] diff --git a/src/natlinkcore/loader.py b/src/natlinkcore/loader.py index e562314..15308ab 100644 --- a/src/natlinkcore/loader.py +++ b/src/natlinkcore/loader.py @@ -3,6 +3,7 @@ import importlib.machinery import importlib.util import logging +from pydebugstring import outputDebugString,OutputDebugStringHandler import os import copy import sys @@ -630,8 +631,51 @@ def config_locations() -> Iterable[str]: # choose between .natlink/natlink.ini in home or the fallback_directory: return [join(home, config_sub_dir, natlink_inifile), fallback_config_file] +def startDap(config : NatlinkConfig) -> bool: + """ + Starts DAP (Debug Adapter Protocol) if there a DAP port specified in the config object. + returns True if the dap was started. + + Natlink will startDap automatically if configured in the run method below. + If you need to start the DAP sooner, edit your code to make a call to startDap. + Similarly, if you want to start the DAP later, call startDap. You can call it from your grammar or + anywhere else. + """ + + dap_started=False + logging.debug(f"testing dap , enabled {config.dap_enabled} port {config.dap_port}") + try: + logging.debug("Debugpy.configure ...") + debugpy.configure(python=f"{python_exec}") + logging.debug("Debugpy.listen ...") + + debugpy.listen(config.dap_port) + dap_started=True + + logging.debug(f"DAP Started on Port {config.dap_port} in {__file__}") + if config.dap_wait_for_debugger_attach_on_startup: + #use info level logging, the user will need to know as natlink and dragon will hang here. + #unti debuger is attached. + logging.info(f"waiting for debugger to attach using DAP in {__file__} ") + debugpy.wait_for_client() + return dap_started + + except Exception as ee: + logging.info(f""" + Exception {ee} while starting DAP in {__file__}. Possible cause is incorrect python executable specified {python_exec} + """ ) + + def run() -> None: - logger = logging.getLogger('natlink') + default_logger=logging.getLogger() + dh = OutputDebugStringHandler() + sh=logging.StreamHandler(sys.stdout) + for h in [sh,dh]: + default_logger.addHandler(h) + + default_logger.setLevel(logging.DEBUG) + + logging.debug(f"{__file__} run()") try: # # TODO: remove this hack. As of October 2021, win32api does not load properly, except if # # the package pywin32_system32 is explictly put on new dll_directory white-list @@ -639,36 +683,26 @@ def run() -> None: # if os.path.isdir(pywin32_dir): # os.add_dll_directory(pywin32_dir) + #create a temporary logging handler, so we can log the startup of DAP + config = NatlinkConfig.from_first_found_file(config_locations()) - dap_started=False - print(f"testing dap , enabled {config.dap_enabled} port {config.dap_port}") - try: - if config.dap_enabled: - print("Debugpy.configure ...") - debugpy.configure(python=f"{python_exec}") - print("Debugpy.listen ...") - - debugpy.listen(config.dap_port) - dap_started=True - - print(f"DAP Started on Port {config.dap_port} in {__file__}") - if config.dap_wait_for_debugger_attach_on_startup: - print(" waiting for debugger to attach") - - except Exception as ee: - print(f""" - Exception {ee} while starting DAP in {__file__}. Possible cause is incorrect python executable specified {python_exec} - """ ) + + dap_started = config.dap_enabled and startDap(config) + logger=logging.getLogger("natlink") + logger.setLevel(logging.DEBUG) main = NatlinkMain(logger, config) + main.setup_logger() main.dap_started=dap_started + for h in [sh,dh]: + default_logger.removeHandler(h) - main.setup_logger() - print(f"Dap enabled: {config.dap_enabled} port: {config.dap_port} ") + + logging.debug(f"Dap enabled: {config.dap_enabled} port: {config.dap_port} ") main.start() except Exception as exc: - print(f'Exception: "{exc}" in loader.run', file=sys.stderr) - print(traceback.format_exc()) + logging.info(f'Exception: "{exc}" in loader.run', file=sys.stderr) + logging.info(traceback.format_exc()) raise Exception from exc if __name__ == "__main__":