| 88 | |
| 89 | |
| 90 | def cmd_output_b( |
| 91 | *cmd: str, |
| 92 | check: bool = True, |
| 93 | **kwargs: Any, |
| 94 | ) -> tuple[int, bytes, bytes | None]: |
| 95 | _setdefault_kwargs(kwargs) |
| 96 | |
| 97 | try: |
| 98 | cmd = parse_shebang.normalize_cmd(cmd, env=kwargs.get('env')) |
| 99 | except parse_shebang.ExecutableNotFoundError as e: |
| 100 | returncode, stdout_b, stderr_b = e.to_output() |
| 101 | else: |
| 102 | try: |
| 103 | proc = subprocess.Popen(cmd, **kwargs) |
| 104 | except OSError as e: |
| 105 | returncode, stdout_b, stderr_b = _oserror_to_output(e) |
| 106 | else: |
| 107 | stdout_b, stderr_b = proc.communicate() |
| 108 | returncode = proc.returncode |
| 109 | |
| 110 | if check and returncode: |
| 111 | raise CalledProcessError(returncode, cmd, stdout_b, stderr_b) |
| 112 | |
| 113 | return returncode, stdout_b, stderr_b |
| 114 | |
| 115 | |
| 116 | def cmd_output(*cmd: str, **kwargs: Any) -> tuple[int, str, str | None]: |