def run_command_status(self, cmd): """Run the command-line `cmd` in a sub-process, and print its output. Use this when you need to test the process behavior of coverage. Compare with `command_line`. Handles the following command names specially: * "python" is replaced with the command name of the current Python interpreter. * "coverage" is replaced with the command name for the main Coverage.py program. Returns a pair: the process' exit status and its stdout/stderr text, which are also stored as `self.last_command_status` and `self.last_command_output`. """ # Make sure "python" and "coverage" mean specifically what we want # them to mean. split_commandline = cmd.split(" ", 1) command_name = split_commandline[0] command_args = split_commandline[1:] if command_name == "python": # Running a Python interpreter in a sub-processes can be tricky. # Use the real name of our own executable. So "python foo.py" might # get executed as "python3.3 foo.py". This is important because # Python 3.x doesn't install as "python", so you might get a Python # 2 executable instead if you don't use the executable's basename. command_name = os.path.basename(sys.executable) if command_name == "coverage": # The invocation requests the Coverage.py program. Substitute the # actual Coverage.py main command name. command_name = self.coverage_command cmd = " ".join([shlex_quote(command_name)] + command_args) # Add our test modules directory to PYTHONPATH. I'm sure there's too # much path munging here, but... here = os.path.dirname(self.nice_file(coverage.__file__, "..")) testmods = self.nice_file(here, 'tests/modules') zipfile = self.nice_file(here, 'tests/zipmods.zip') pypath = os.getenv('PYTHONPATH', '') if pypath: pypath += os.pathsep pypath += testmods + os.pathsep + zipfile self.set_environ('PYTHONPATH', pypath) self.last_command_status, self.last_command_output = run_command(cmd) print(self.last_command_output) return self.last_command_status, self.last_command_output
def run_command(self, cmd): """Run the command-line `cmd` in a sub-process. `cmd` is the command line to invoke in a sub-process. Returns the combined content of `stdout` and `stderr` output streams from the sub-process. Use this when you need to test the process behavior of coverage. Compare with `command_line`. Handles the following command name specially: * "python" is replaced with the command name of the current Python interpreter. * "coverage" is replaced with the command name for the main Coverage.py program. """ split_commandline = cmd.split(" ", 1) command_name = split_commandline[0] command_args = split_commandline[1:] if command_name == "python": # Running a Python interpreter in a sub-processes can be tricky. # Use the real name of our own executable. So "python foo.py" might # get executed as "python3.3 foo.py". This is important because # Python 3.x doesn't install as "python", so you might get a Python # 2 executable instead if you don't use the executable's basename. command_name = os.path.basename(sys.executable) if command_name == "coverage": # The invocation requests the Coverage.py program. Substitute the # actual Coverage.py main command name. command_name = self.coverage_command full_commandline = " ".join([shlex_quote(command_name)] + command_args) _, output = self.run_command_status(full_commandline) return output
def run_command_status(self, cmd): """Run the command-line `cmd` in a sub-process, and print its output. Use this when you need to test the process behavior of coverage. Compare with `command_line`. Handles the following command names specially: * "python" is replaced with the command name of the current Python interpreter. * "coverage" is replaced with the command name for the main coverage.py program. Returns a pair: the process' exit status and its stdout/stderr text, which are also stored as `self.last_command_status` and `self.last_command_output`. """ # Make sure "python" and "coverage" mean specifically what we want # them to mean. split_commandline = cmd.split() command_name = split_commandline[0] command_args = split_commandline[1:] if command_name == "python": # Running a Python interpreter in a sub-processes can be tricky. # Use the real name of our own executable. So "python foo.py" might # get executed as "python3.3 foo.py". This is important because # Python 3.x doesn't install as "python", so you might get a Python # 2 executable instead if you don't use the executable's basename. command_words = [os.path.basename(sys.executable)] elif command_name == "coverage": if env.JYTHON: # pragma: only jython # Jython can't do reporting, so let's skip the test now. if command_args and command_args[0] in ('report', 'html', 'xml', 'annotate'): pytest.skip("Can't run reporting commands in Jython") # Jython can't run "coverage" as a command because the shebang # refers to another shebang'd Python script. So run them as # modules. command_words = "jython -m coverage".split() else: # The invocation requests the coverage.py program. Substitute the # actual coverage.py main command name. command_words = [self.coverage_command] else: command_words = [command_name] cmd = " ".join([shlex_quote(w) for w in command_words] + command_args) # Add our test modules directory to PYTHONPATH. I'm sure there's too # much path munging here, but... pythonpath_name = "PYTHONPATH" if env.JYTHON: pythonpath_name = "JYTHONPATH" # pragma: only jython testmods = self.nice_file(self.working_root(), 'tests/modules') zipfile = self.nice_file(self.working_root(), 'tests/zipmods.zip') pypath = os.getenv(pythonpath_name, '') if pypath: pypath += os.pathsep pypath += testmods + os.pathsep + zipfile self.set_environ(pythonpath_name, pypath) self.last_command_status, self.last_command_output = run_command(cmd) print(self.last_command_output) return self.last_command_status, self.last_command_output