From a141be4adde0a9b2e2f25275a2874067b7c78481 Mon Sep 17 00:00:00 2001 From: "simon.chupin" Date: Mon, 18 Jul 2022 16:13:28 +0200 Subject: [PATCH] tools: Improve the error message for handling NotImplementedError on Windows --- tools/idf_py_actions/tools.py | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/tools/idf_py_actions/tools.py b/tools/idf_py_actions/tools.py index 1543db912e..e2b257823c 100644 --- a/tools/idf_py_actions/tools.py +++ b/tools/idf_py_actions/tools.py @@ -8,7 +8,7 @@ import sys from asyncio.subprocess import Process from io import open from types import FunctionType -from typing import Any, Dict, List, Optional, TextIO, Tuple +from typing import Any, Dict, List, Optional, TextIO, Tuple, Union import click import yaml @@ -143,7 +143,12 @@ class RunTool: env_copy = dict(os.environ) env_copy.update(self.env or {}) - process, stderr_output_file, stdout_output_file = asyncio.run(self.run_command(self.args, env_copy)) + process: Union[Process, subprocess.CompletedProcess[bytes]] + if self.hints: + process, stderr_output_file, stdout_output_file = asyncio.run(self.run_command(self.args, env_copy)) + else: + process = subprocess.run(self.args, env=env_copy, cwd=self.cwd) + stderr_output_file, stdout_output_file = None, None if process.returncode == 0: return @@ -161,10 +166,6 @@ class RunTool: async def run_command(self, cmd: List, env_copy: Dict) -> Tuple[Process, Optional[str], Optional[str]]: """ Run the `cmd` command with capturing stderr and stdout from that function and return returncode and of the command, the id of the process, paths to captured output """ - if not self.hints: - p = await asyncio.create_subprocess_exec(*cmd, env=env_copy, cwd=self.cwd) - await p.wait() # added for avoiding None returncode - return p, None, None log_dir_name = 'log' try: os.mkdir(os.path.join(self.build_dir, log_dir_name)) @@ -172,8 +173,12 @@ class RunTool: pass # Note: we explicitly pass in os.environ here, as we may have set IDF_PATH there during startup # limit was added for avoiding error in idf.py confserver - p = await asyncio.create_subprocess_exec(*cmd, env=env_copy, limit=1024 * 256, cwd=self.cwd, stdout=asyncio.subprocess.PIPE, - stderr=asyncio.subprocess.PIPE, ) + try: + p = await asyncio.create_subprocess_exec(*cmd, env=env_copy, limit=1024 * 256, cwd=self.cwd, stdout=asyncio.subprocess.PIPE, + stderr=asyncio.subprocess.PIPE) + except NotImplementedError: + sys.exit(f'ERROR: {sys.executable} doesn\'t support asyncio. The issue can be worked around by re-running idf.py with the "--no-hints" argument.') + stderr_output_file = os.path.join(self.build_dir, log_dir_name, f'idf_py_stderr_output_{p.pid}') stdout_output_file = os.path.join(self.build_dir, log_dir_name, f'idf_py_stdout_output_{p.pid}') if p.stderr and p.stdout: # it only to avoid None type in p.std