GLOB sdist-make: /tmp/tmprhq4wk8a/pytest-mpi-0.4/setup.py py38 create: /tmp/tmprhq4wk8a/pytest-mpi-0.4/.tox/py38 py38 installdeps: pytest==6.0.1, pytest-cov, sybil, -cknown_broken_constraints.txt py38 inst: /tmp/tmprhq4wk8a/pytest-mpi-0.4/.tox/.tmp/package/1/pytest-mpi-0.4.zip py38 installed: attrs==20.1.0,coverage==5.2.1,iniconfig==1.0.1,more-itertools==8.5.0,packaging==20.4,pluggy==0.13.1,py==1.9.0,pyparsing==2.4.7,pytest==6.0.1,pytest-cov==2.10.1,pytest-mpi @ file:///tmp/tmprhq4wk8a/pytest-mpi-0.4/.tox/.tmp/package/1/pytest-mpi-0.4.zip,six==1.15.0,sybil==1.4.0,toml==0.10.1 py38 run-test-pre: PYTHONHASHSEED='1604777528' py38 run-test: commands[0] | py.test -p pytester --cov=/tmp/tmprhq4wk8a/pytest-mpi-0.4/.tox/py38/lib/python3.8/site-packages/pytest_mpi --runpytest=subprocess ============================= test session starts ============================== platform linux -- Python 3.8.0, pytest-6.0.1, py-1.9.0, pluggy-0.13.1 cachedir: .tox/py38/.pytest_cache rootdir: /tmp/tmprhq4wk8a/pytest-mpi-0.4 plugins: cov-2.10.1, mpi-0.4 collected 13 items docs/markers.rst . [ 7%] docs/usage.rst .. [ 23%] tests/test_fixtures.py FFF [ 46%] tests/test_markers.py .FF.F.F [100%] =================================== FAILURES =================================== ______________________________ test_mpi_file_name ______________________________ mpi_testdir = has_mpi4py = False def test_mpi_file_name(mpi_testdir, has_mpi4py): mpi_testdir.makepyfile(MPI_FILE_NAME_TEST_CODE) > result = mpi_testdir.runpytest("--with-mpi", timeout=5) /tmp/tmprhq4wk8a/pytest-mpi-0.4/tests/test_fixtures.py:54: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /tmp/tmprhq4wk8a/pytest-mpi-0.4/tests/conftest.py:52: in runpytest return self.runpytest_subprocess(*args, **kwargs) /tmp/tmprhq4wk8a/pytest-mpi-0.4/tests/conftest.py:44: in runpytest_subprocess return self.run(*args, timeout=timeout) /tmp/tmprhq4wk8a/pytest-mpi-0.4/.tox/py38/lib/python3.8/site-packages/_pytest/pytester.py:1193: in popen popen = subprocess.Popen(cmdargs, stdout=stdout, stderr=stderr, **kw) /opt/python/3.8.0/lib/python3.8/subprocess.py:854: in __init__ self._execute_child(args, executable, preexec_fn, close_fds, _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = args = ['mpirun', '-n', '2', '/tmp/tmprhq4wk8a/pytest-mpi-0.4/.tox/py38/bin/python', '-mpytest', '--basetemp=/tmp/pytest-of-travis/pytest-37/test_mpi_file_name0/runpytest-0', ...] executable = b'mpirun', preexec_fn = None, close_fds = True, pass_fds = () cwd = None env = {'COV_CORE_CONFIG': ':', 'COV_CORE_DATAFILE': '/tmp/tmprhq4wk8a/pytest-mpi-0.4/.coverage', 'COV_CORE_SOURCE': '/tmp/tm.../.tox/py38/lib/python3.8/site-packages/pytest_mpi', 'HOME': '/tmp/pytest-of-travis/pytest-37/test_mpi_file_name0', ...} startupinfo = None, creationflags = 0, shell = False, p2cread = 13 p2cwrite = 14, c2pread = -1, c2pwrite = 11, errread = -1, errwrite = 12 restore_signals = True, start_new_session = False def _execute_child(self, args, executable, preexec_fn, close_fds, pass_fds, cwd, env, startupinfo, creationflags, shell, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, restore_signals, start_new_session): """Execute program (POSIX version)""" if isinstance(args, (str, bytes)): args = [args] elif isinstance(args, os.PathLike): if shell: raise TypeError('path-like args is not allowed when ' 'shell is true') args = [args] else: args = list(args) if shell: # On Android the default shell is at '/system/bin/sh'. unix_shell = ('/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh') args = [unix_shell, "-c"] + args if executable: args[0] = executable if executable is None: executable = args[0] sys.audit("subprocess.Popen", executable, args, cwd, env) if (_USE_POSIX_SPAWN and os.path.dirname(executable) and preexec_fn is None and not close_fds and not pass_fds and cwd is None and (p2cread == -1 or p2cread > 2) and (c2pwrite == -1 or c2pwrite > 2) and (errwrite == -1 or errwrite > 2) and not start_new_session): self._posix_spawn(args, executable, env, restore_signals, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite) return orig_executable = executable # For transferring possible exec failure from child to parent. # Data format: "exception name:hex errno:description" # Pickle is not used; it is complex and involves memory allocation. errpipe_read, errpipe_write = os.pipe() # errpipe_write must not be in the standard io 0, 1, or 2 fd range. low_fds_to_close = [] while errpipe_write < 3: low_fds_to_close.append(errpipe_write) errpipe_write = os.dup(errpipe_write) for low_fd in low_fds_to_close: os.close(low_fd) try: try: # We must avoid complex work that could involve # malloc or free in the child process to avoid # potential deadlocks, thus we do all this here. # and pass it to fork_exec() if env is not None: env_list = [] for k, v in env.items(): k = os.fsencode(k) if b'=' in k: raise ValueError("illegal environment variable name") env_list.append(k + b'=' + os.fsencode(v)) else: env_list = None # Use execv instead of execve. executable = os.fsencode(executable) if os.path.dirname(executable): executable_list = (executable,) else: # This matches the behavior of os._execvpe(). executable_list = tuple( os.path.join(os.fsencode(dir), executable) for dir in os.get_exec_path(env)) fds_to_keep = set(pass_fds) fds_to_keep.add(errpipe_write) self.pid = _posixsubprocess.fork_exec( args, executable_list, close_fds, tuple(sorted(map(int, fds_to_keep))), cwd, env_list, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, errpipe_read, errpipe_write, restore_signals, start_new_session, preexec_fn) self._child_created = True finally: # be sure the FD is closed no matter what os.close(errpipe_write) self._close_pipe_fds(p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite) # Wait for exec to fail or succeed; possibly raising an # exception (limited in size) errpipe_data = bytearray() while True: part = os.read(errpipe_read, 50000) errpipe_data += part if not part or len(errpipe_data) > 50000: break finally: # be sure the FD is closed no matter what os.close(errpipe_read) if errpipe_data: try: pid, sts = os.waitpid(self.pid, 0) if pid == self.pid: self._handle_exitstatus(sts) else: self.returncode = sys.maxsize except ChildProcessError: pass try: exception_name, hex_errno, err_msg = ( errpipe_data.split(b':', 2)) # The encoding here should match the encoding # written in by the subprocess implementations # like _posixsubprocess err_msg = err_msg.decode() except ValueError: exception_name = b'SubprocessError' hex_errno = b'0' err_msg = 'Bad exception data from child: {!r}'.format( bytes(errpipe_data)) child_exception_type = getattr( builtins, exception_name.decode('ascii'), SubprocessError) if issubclass(child_exception_type, OSError) and hex_errno: errno_num = int(hex_errno, 16) child_exec_never_called = (err_msg == "noexec") if child_exec_never_called: err_msg = "" # The error must be from chdir(cwd). err_filename = cwd else: err_filename = orig_executable if errno_num != 0: err_msg = os.strerror(errno_num) > raise child_exception_type(errno_num, err_msg, err_filename) E FileNotFoundError: [Errno 2] No such file or directory: 'mpirun' /opt/python/3.8.0/lib/python3.8/subprocess.py:1702: FileNotFoundError ----------------------------- Captured stdout call ----------------------------- running: mpirun -n 2 /tmp/tmprhq4wk8a/pytest-mpi-0.4/.tox/py38/bin/python -mpytest --basetemp=/tmp/pytest-of-travis/pytest-37/test_mpi_file_name0/runpytest-0 --with-mpi in: /tmp/pytest-of-travis/pytest-37/test_mpi_file_name0 _______________________________ test_mpi_tmpdir ________________________________ mpi_testdir = has_mpi4py = False def test_mpi_tmpdir(mpi_testdir, has_mpi4py): mpi_testdir.makepyfile(MPI_TMPDIR_TEST_CODE) > result = mpi_testdir.runpytest("--with-mpi", timeout=5) /tmp/tmprhq4wk8a/pytest-mpi-0.4/tests/test_fixtures.py:65: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /tmp/tmprhq4wk8a/pytest-mpi-0.4/tests/conftest.py:52: in runpytest return self.runpytest_subprocess(*args, **kwargs) /tmp/tmprhq4wk8a/pytest-mpi-0.4/tests/conftest.py:44: in runpytest_subprocess return self.run(*args, timeout=timeout) /tmp/tmprhq4wk8a/pytest-mpi-0.4/.tox/py38/lib/python3.8/site-packages/_pytest/pytester.py:1193: in popen popen = subprocess.Popen(cmdargs, stdout=stdout, stderr=stderr, **kw) /opt/python/3.8.0/lib/python3.8/subprocess.py:854: in __init__ self._execute_child(args, executable, preexec_fn, close_fds, _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = args = ['mpirun', '-n', '2', '/tmp/tmprhq4wk8a/pytest-mpi-0.4/.tox/py38/bin/python', '-mpytest', '--basetemp=/tmp/pytest-of-travis/pytest-37/test_mpi_tmpdir0/runpytest-0', ...] executable = b'mpirun', preexec_fn = None, close_fds = True, pass_fds = () cwd = None env = {'COV_CORE_CONFIG': ':', 'COV_CORE_DATAFILE': '/tmp/tmprhq4wk8a/pytest-mpi-0.4/.coverage', 'COV_CORE_SOURCE': '/tmp/tm...0.4/.tox/py38/lib/python3.8/site-packages/pytest_mpi', 'HOME': '/tmp/pytest-of-travis/pytest-37/test_mpi_tmpdir0', ...} startupinfo = None, creationflags = 0, shell = False, p2cread = 13 p2cwrite = 14, c2pread = -1, c2pwrite = 11, errread = -1, errwrite = 12 restore_signals = True, start_new_session = False def _execute_child(self, args, executable, preexec_fn, close_fds, pass_fds, cwd, env, startupinfo, creationflags, shell, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, restore_signals, start_new_session): """Execute program (POSIX version)""" if isinstance(args, (str, bytes)): args = [args] elif isinstance(args, os.PathLike): if shell: raise TypeError('path-like args is not allowed when ' 'shell is true') args = [args] else: args = list(args) if shell: # On Android the default shell is at '/system/bin/sh'. unix_shell = ('/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh') args = [unix_shell, "-c"] + args if executable: args[0] = executable if executable is None: executable = args[0] sys.audit("subprocess.Popen", executable, args, cwd, env) if (_USE_POSIX_SPAWN and os.path.dirname(executable) and preexec_fn is None and not close_fds and not pass_fds and cwd is None and (p2cread == -1 or p2cread > 2) and (c2pwrite == -1 or c2pwrite > 2) and (errwrite == -1 or errwrite > 2) and not start_new_session): self._posix_spawn(args, executable, env, restore_signals, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite) return orig_executable = executable # For transferring possible exec failure from child to parent. # Data format: "exception name:hex errno:description" # Pickle is not used; it is complex and involves memory allocation. errpipe_read, errpipe_write = os.pipe() # errpipe_write must not be in the standard io 0, 1, or 2 fd range. low_fds_to_close = [] while errpipe_write < 3: low_fds_to_close.append(errpipe_write) errpipe_write = os.dup(errpipe_write) for low_fd in low_fds_to_close: os.close(low_fd) try: try: # We must avoid complex work that could involve # malloc or free in the child process to avoid # potential deadlocks, thus we do all this here. # and pass it to fork_exec() if env is not None: env_list = [] for k, v in env.items(): k = os.fsencode(k) if b'=' in k: raise ValueError("illegal environment variable name") env_list.append(k + b'=' + os.fsencode(v)) else: env_list = None # Use execv instead of execve. executable = os.fsencode(executable) if os.path.dirname(executable): executable_list = (executable,) else: # This matches the behavior of os._execvpe(). executable_list = tuple( os.path.join(os.fsencode(dir), executable) for dir in os.get_exec_path(env)) fds_to_keep = set(pass_fds) fds_to_keep.add(errpipe_write) self.pid = _posixsubprocess.fork_exec( args, executable_list, close_fds, tuple(sorted(map(int, fds_to_keep))), cwd, env_list, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, errpipe_read, errpipe_write, restore_signals, start_new_session, preexec_fn) self._child_created = True finally: # be sure the FD is closed no matter what os.close(errpipe_write) self._close_pipe_fds(p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite) # Wait for exec to fail or succeed; possibly raising an # exception (limited in size) errpipe_data = bytearray() while True: part = os.read(errpipe_read, 50000) errpipe_data += part if not part or len(errpipe_data) > 50000: break finally: # be sure the FD is closed no matter what os.close(errpipe_read) if errpipe_data: try: pid, sts = os.waitpid(self.pid, 0) if pid == self.pid: self._handle_exitstatus(sts) else: self.returncode = sys.maxsize except ChildProcessError: pass try: exception_name, hex_errno, err_msg = ( errpipe_data.split(b':', 2)) # The encoding here should match the encoding # written in by the subprocess implementations # like _posixsubprocess err_msg = err_msg.decode() except ValueError: exception_name = b'SubprocessError' hex_errno = b'0' err_msg = 'Bad exception data from child: {!r}'.format( bytes(errpipe_data)) child_exception_type = getattr( builtins, exception_name.decode('ascii'), SubprocessError) if issubclass(child_exception_type, OSError) and hex_errno: errno_num = int(hex_errno, 16) child_exec_never_called = (err_msg == "noexec") if child_exec_never_called: err_msg = "" # The error must be from chdir(cwd). err_filename = cwd else: err_filename = orig_executable if errno_num != 0: err_msg = os.strerror(errno_num) > raise child_exception_type(errno_num, err_msg, err_filename) E FileNotFoundError: [Errno 2] No such file or directory: 'mpirun' /opt/python/3.8.0/lib/python3.8/subprocess.py:1702: FileNotFoundError ----------------------------- Captured stdout call ----------------------------- running: mpirun -n 2 /tmp/tmprhq4wk8a/pytest-mpi-0.4/.tox/py38/bin/python -mpytest --basetemp=/tmp/pytest-of-travis/pytest-37/test_mpi_tmpdir0/runpytest-0 --with-mpi in: /tmp/pytest-of-travis/pytest-37/test_mpi_tmpdir0 ______________________________ test_mpi_tmp_path _______________________________ mpi_testdir = has_mpi4py = False def test_mpi_tmp_path(mpi_testdir, has_mpi4py): mpi_testdir.makepyfile(MPI_TMP_PATH_TEST_CODE) > result = mpi_testdir.runpytest("--with-mpi", timeout=5) /tmp/tmprhq4wk8a/pytest-mpi-0.4/tests/test_fixtures.py:76: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /tmp/tmprhq4wk8a/pytest-mpi-0.4/tests/conftest.py:52: in runpytest return self.runpytest_subprocess(*args, **kwargs) /tmp/tmprhq4wk8a/pytest-mpi-0.4/tests/conftest.py:44: in runpytest_subprocess return self.run(*args, timeout=timeout) /tmp/tmprhq4wk8a/pytest-mpi-0.4/.tox/py38/lib/python3.8/site-packages/_pytest/pytester.py:1193: in popen popen = subprocess.Popen(cmdargs, stdout=stdout, stderr=stderr, **kw) /opt/python/3.8.0/lib/python3.8/subprocess.py:854: in __init__ self._execute_child(args, executable, preexec_fn, close_fds, _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = args = ['mpirun', '-n', '2', '/tmp/tmprhq4wk8a/pytest-mpi-0.4/.tox/py38/bin/python', '-mpytest', '--basetemp=/tmp/pytest-of-travis/pytest-37/test_mpi_tmp_path0/runpytest-0', ...] executable = b'mpirun', preexec_fn = None, close_fds = True, pass_fds = () cwd = None env = {'COV_CORE_CONFIG': ':', 'COV_CORE_DATAFILE': '/tmp/tmprhq4wk8a/pytest-mpi-0.4/.coverage', 'COV_CORE_SOURCE': '/tmp/tm...4/.tox/py38/lib/python3.8/site-packages/pytest_mpi', 'HOME': '/tmp/pytest-of-travis/pytest-37/test_mpi_tmp_path0', ...} startupinfo = None, creationflags = 0, shell = False, p2cread = 13 p2cwrite = 14, c2pread = -1, c2pwrite = 11, errread = -1, errwrite = 12 restore_signals = True, start_new_session = False def _execute_child(self, args, executable, preexec_fn, close_fds, pass_fds, cwd, env, startupinfo, creationflags, shell, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, restore_signals, start_new_session): """Execute program (POSIX version)""" if isinstance(args, (str, bytes)): args = [args] elif isinstance(args, os.PathLike): if shell: raise TypeError('path-like args is not allowed when ' 'shell is true') args = [args] else: args = list(args) if shell: # On Android the default shell is at '/system/bin/sh'. unix_shell = ('/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh') args = [unix_shell, "-c"] + args if executable: args[0] = executable if executable is None: executable = args[0] sys.audit("subprocess.Popen", executable, args, cwd, env) if (_USE_POSIX_SPAWN and os.path.dirname(executable) and preexec_fn is None and not close_fds and not pass_fds and cwd is None and (p2cread == -1 or p2cread > 2) and (c2pwrite == -1 or c2pwrite > 2) and (errwrite == -1 or errwrite > 2) and not start_new_session): self._posix_spawn(args, executable, env, restore_signals, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite) return orig_executable = executable # For transferring possible exec failure from child to parent. # Data format: "exception name:hex errno:description" # Pickle is not used; it is complex and involves memory allocation. errpipe_read, errpipe_write = os.pipe() # errpipe_write must not be in the standard io 0, 1, or 2 fd range. low_fds_to_close = [] while errpipe_write < 3: low_fds_to_close.append(errpipe_write) errpipe_write = os.dup(errpipe_write) for low_fd in low_fds_to_close: os.close(low_fd) try: try: # We must avoid complex work that could involve # malloc or free in the child process to avoid # potential deadlocks, thus we do all this here. # and pass it to fork_exec() if env is not None: env_list = [] for k, v in env.items(): k = os.fsencode(k) if b'=' in k: raise ValueError("illegal environment variable name") env_list.append(k + b'=' + os.fsencode(v)) else: env_list = None # Use execv instead of execve. executable = os.fsencode(executable) if os.path.dirname(executable): executable_list = (executable,) else: # This matches the behavior of os._execvpe(). executable_list = tuple( os.path.join(os.fsencode(dir), executable) for dir in os.get_exec_path(env)) fds_to_keep = set(pass_fds) fds_to_keep.add(errpipe_write) self.pid = _posixsubprocess.fork_exec( args, executable_list, close_fds, tuple(sorted(map(int, fds_to_keep))), cwd, env_list, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, errpipe_read, errpipe_write, restore_signals, start_new_session, preexec_fn) self._child_created = True finally: # be sure the FD is closed no matter what os.close(errpipe_write) self._close_pipe_fds(p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite) # Wait for exec to fail or succeed; possibly raising an # exception (limited in size) errpipe_data = bytearray() while True: part = os.read(errpipe_read, 50000) errpipe_data += part if not part or len(errpipe_data) > 50000: break finally: # be sure the FD is closed no matter what os.close(errpipe_read) if errpipe_data: try: pid, sts = os.waitpid(self.pid, 0) if pid == self.pid: self._handle_exitstatus(sts) else: self.returncode = sys.maxsize except ChildProcessError: pass try: exception_name, hex_errno, err_msg = ( errpipe_data.split(b':', 2)) # The encoding here should match the encoding # written in by the subprocess implementations # like _posixsubprocess err_msg = err_msg.decode() except ValueError: exception_name = b'SubprocessError' hex_errno = b'0' err_msg = 'Bad exception data from child: {!r}'.format( bytes(errpipe_data)) child_exception_type = getattr( builtins, exception_name.decode('ascii'), SubprocessError) if issubclass(child_exception_type, OSError) and hex_errno: errno_num = int(hex_errno, 16) child_exec_never_called = (err_msg == "noexec") if child_exec_never_called: err_msg = "" # The error must be from chdir(cwd). err_filename = cwd else: err_filename = orig_executable if errno_num != 0: err_msg = os.strerror(errno_num) > raise child_exception_type(errno_num, err_msg, err_filename) E FileNotFoundError: [Errno 2] No such file or directory: 'mpirun' /opt/python/3.8.0/lib/python3.8/subprocess.py:1702: FileNotFoundError ----------------------------- Captured stdout call ----------------------------- running: mpirun -n 2 /tmp/tmprhq4wk8a/pytest-mpi-0.4/.tox/py38/bin/python -mpytest --basetemp=/tmp/pytest-of-travis/pytest-37/test_mpi_tmp_path0/runpytest-0 --with-mpi in: /tmp/pytest-of-travis/pytest-37/test_mpi_tmp_path0 ______________________________ test_mpi_with_mpi _______________________________ mpi_testdir = has_mpi4py = False def test_mpi_with_mpi(mpi_testdir, has_mpi4py): mpi_testdir.makepyfile(MPI_TEST_CODE) > result = mpi_testdir.runpytest("--with-mpi") /tmp/tmprhq4wk8a/pytest-mpi-0.4/tests/test_markers.py:67: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /tmp/tmprhq4wk8a/pytest-mpi-0.4/tests/conftest.py:52: in runpytest return self.runpytest_subprocess(*args, **kwargs) /tmp/tmprhq4wk8a/pytest-mpi-0.4/tests/conftest.py:44: in runpytest_subprocess return self.run(*args, timeout=timeout) /tmp/tmprhq4wk8a/pytest-mpi-0.4/.tox/py38/lib/python3.8/site-packages/_pytest/pytester.py:1193: in popen popen = subprocess.Popen(cmdargs, stdout=stdout, stderr=stderr, **kw) /opt/python/3.8.0/lib/python3.8/subprocess.py:854: in __init__ self._execute_child(args, executable, preexec_fn, close_fds, _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = args = ['mpirun', '-n', '2', '/tmp/tmprhq4wk8a/pytest-mpi-0.4/.tox/py38/bin/python', '-mpytest', '--basetemp=/tmp/pytest-of-travis/pytest-37/test_mpi_with_mpi0/runpytest-0', ...] executable = b'mpirun', preexec_fn = None, close_fds = True, pass_fds = () cwd = None env = {'COV_CORE_CONFIG': ':', 'COV_CORE_DATAFILE': '/tmp/tmprhq4wk8a/pytest-mpi-0.4/.coverage', 'COV_CORE_SOURCE': '/tmp/tm...4/.tox/py38/lib/python3.8/site-packages/pytest_mpi', 'HOME': '/tmp/pytest-of-travis/pytest-37/test_mpi_with_mpi0', ...} startupinfo = None, creationflags = 0, shell = False, p2cread = 13 p2cwrite = 14, c2pread = -1, c2pwrite = 11, errread = -1, errwrite = 12 restore_signals = True, start_new_session = False def _execute_child(self, args, executable, preexec_fn, close_fds, pass_fds, cwd, env, startupinfo, creationflags, shell, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, restore_signals, start_new_session): """Execute program (POSIX version)""" if isinstance(args, (str, bytes)): args = [args] elif isinstance(args, os.PathLike): if shell: raise TypeError('path-like args is not allowed when ' 'shell is true') args = [args] else: args = list(args) if shell: # On Android the default shell is at '/system/bin/sh'. unix_shell = ('/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh') args = [unix_shell, "-c"] + args if executable: args[0] = executable if executable is None: executable = args[0] sys.audit("subprocess.Popen", executable, args, cwd, env) if (_USE_POSIX_SPAWN and os.path.dirname(executable) and preexec_fn is None and not close_fds and not pass_fds and cwd is None and (p2cread == -1 or p2cread > 2) and (c2pwrite == -1 or c2pwrite > 2) and (errwrite == -1 or errwrite > 2) and not start_new_session): self._posix_spawn(args, executable, env, restore_signals, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite) return orig_executable = executable # For transferring possible exec failure from child to parent. # Data format: "exception name:hex errno:description" # Pickle is not used; it is complex and involves memory allocation. errpipe_read, errpipe_write = os.pipe() # errpipe_write must not be in the standard io 0, 1, or 2 fd range. low_fds_to_close = [] while errpipe_write < 3: low_fds_to_close.append(errpipe_write) errpipe_write = os.dup(errpipe_write) for low_fd in low_fds_to_close: os.close(low_fd) try: try: # We must avoid complex work that could involve # malloc or free in the child process to avoid # potential deadlocks, thus we do all this here. # and pass it to fork_exec() if env is not None: env_list = [] for k, v in env.items(): k = os.fsencode(k) if b'=' in k: raise ValueError("illegal environment variable name") env_list.append(k + b'=' + os.fsencode(v)) else: env_list = None # Use execv instead of execve. executable = os.fsencode(executable) if os.path.dirname(executable): executable_list = (executable,) else: # This matches the behavior of os._execvpe(). executable_list = tuple( os.path.join(os.fsencode(dir), executable) for dir in os.get_exec_path(env)) fds_to_keep = set(pass_fds) fds_to_keep.add(errpipe_write) self.pid = _posixsubprocess.fork_exec( args, executable_list, close_fds, tuple(sorted(map(int, fds_to_keep))), cwd, env_list, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, errpipe_read, errpipe_write, restore_signals, start_new_session, preexec_fn) self._child_created = True finally: # be sure the FD is closed no matter what os.close(errpipe_write) self._close_pipe_fds(p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite) # Wait for exec to fail or succeed; possibly raising an # exception (limited in size) errpipe_data = bytearray() while True: part = os.read(errpipe_read, 50000) errpipe_data += part if not part or len(errpipe_data) > 50000: break finally: # be sure the FD is closed no matter what os.close(errpipe_read) if errpipe_data: try: pid, sts = os.waitpid(self.pid, 0) if pid == self.pid: self._handle_exitstatus(sts) else: self.returncode = sys.maxsize except ChildProcessError: pass try: exception_name, hex_errno, err_msg = ( errpipe_data.split(b':', 2)) # The encoding here should match the encoding # written in by the subprocess implementations # like _posixsubprocess err_msg = err_msg.decode() except ValueError: exception_name = b'SubprocessError' hex_errno = b'0' err_msg = 'Bad exception data from child: {!r}'.format( bytes(errpipe_data)) child_exception_type = getattr( builtins, exception_name.decode('ascii'), SubprocessError) if issubclass(child_exception_type, OSError) and hex_errno: errno_num = int(hex_errno, 16) child_exec_never_called = (err_msg == "noexec") if child_exec_never_called: err_msg = "" # The error must be from chdir(cwd). err_filename = cwd else: err_filename = orig_executable if errno_num != 0: err_msg = os.strerror(errno_num) > raise child_exception_type(errno_num, err_msg, err_filename) E FileNotFoundError: [Errno 2] No such file or directory: 'mpirun' /opt/python/3.8.0/lib/python3.8/subprocess.py:1702: FileNotFoundError ----------------------------- Captured stdout call ----------------------------- running: mpirun -n 2 /tmp/tmprhq4wk8a/pytest-mpi-0.4/.tox/py38/bin/python -mpytest --basetemp=/tmp/pytest-of-travis/pytest-37/test_mpi_with_mpi0/runpytest-0 --with-mpi in: /tmp/pytest-of-travis/pytest-37/test_mpi_with_mpi0 ______________________________ test_mpi_only_mpi _______________________________ mpi_testdir = has_mpi4py = False def test_mpi_only_mpi(mpi_testdir, has_mpi4py): mpi_testdir.makepyfile(MPI_TEST_CODE) > result = mpi_testdir.runpytest("--only-mpi") /tmp/tmprhq4wk8a/pytest-mpi-0.4/tests/test_markers.py:78: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /tmp/tmprhq4wk8a/pytest-mpi-0.4/tests/conftest.py:52: in runpytest return self.runpytest_subprocess(*args, **kwargs) /tmp/tmprhq4wk8a/pytest-mpi-0.4/tests/conftest.py:44: in runpytest_subprocess return self.run(*args, timeout=timeout) /tmp/tmprhq4wk8a/pytest-mpi-0.4/.tox/py38/lib/python3.8/site-packages/_pytest/pytester.py:1193: in popen popen = subprocess.Popen(cmdargs, stdout=stdout, stderr=stderr, **kw) /opt/python/3.8.0/lib/python3.8/subprocess.py:854: in __init__ self._execute_child(args, executable, preexec_fn, close_fds, _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = args = ['mpirun', '-n', '2', '/tmp/tmprhq4wk8a/pytest-mpi-0.4/.tox/py38/bin/python', '-mpytest', '--basetemp=/tmp/pytest-of-travis/pytest-37/test_mpi_only_mpi0/runpytest-0', ...] executable = b'mpirun', preexec_fn = None, close_fds = True, pass_fds = () cwd = None env = {'COV_CORE_CONFIG': ':', 'COV_CORE_DATAFILE': '/tmp/tmprhq4wk8a/pytest-mpi-0.4/.coverage', 'COV_CORE_SOURCE': '/tmp/tm...4/.tox/py38/lib/python3.8/site-packages/pytest_mpi', 'HOME': '/tmp/pytest-of-travis/pytest-37/test_mpi_only_mpi0', ...} startupinfo = None, creationflags = 0, shell = False, p2cread = 13 p2cwrite = 14, c2pread = -1, c2pwrite = 11, errread = -1, errwrite = 12 restore_signals = True, start_new_session = False def _execute_child(self, args, executable, preexec_fn, close_fds, pass_fds, cwd, env, startupinfo, creationflags, shell, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, restore_signals, start_new_session): """Execute program (POSIX version)""" if isinstance(args, (str, bytes)): args = [args] elif isinstance(args, os.PathLike): if shell: raise TypeError('path-like args is not allowed when ' 'shell is true') args = [args] else: args = list(args) if shell: # On Android the default shell is at '/system/bin/sh'. unix_shell = ('/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh') args = [unix_shell, "-c"] + args if executable: args[0] = executable if executable is None: executable = args[0] sys.audit("subprocess.Popen", executable, args, cwd, env) if (_USE_POSIX_SPAWN and os.path.dirname(executable) and preexec_fn is None and not close_fds and not pass_fds and cwd is None and (p2cread == -1 or p2cread > 2) and (c2pwrite == -1 or c2pwrite > 2) and (errwrite == -1 or errwrite > 2) and not start_new_session): self._posix_spawn(args, executable, env, restore_signals, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite) return orig_executable = executable # For transferring possible exec failure from child to parent. # Data format: "exception name:hex errno:description" # Pickle is not used; it is complex and involves memory allocation. errpipe_read, errpipe_write = os.pipe() # errpipe_write must not be in the standard io 0, 1, or 2 fd range. low_fds_to_close = [] while errpipe_write < 3: low_fds_to_close.append(errpipe_write) errpipe_write = os.dup(errpipe_write) for low_fd in low_fds_to_close: os.close(low_fd) try: try: # We must avoid complex work that could involve # malloc or free in the child process to avoid # potential deadlocks, thus we do all this here. # and pass it to fork_exec() if env is not None: env_list = [] for k, v in env.items(): k = os.fsencode(k) if b'=' in k: raise ValueError("illegal environment variable name") env_list.append(k + b'=' + os.fsencode(v)) else: env_list = None # Use execv instead of execve. executable = os.fsencode(executable) if os.path.dirname(executable): executable_list = (executable,) else: # This matches the behavior of os._execvpe(). executable_list = tuple( os.path.join(os.fsencode(dir), executable) for dir in os.get_exec_path(env)) fds_to_keep = set(pass_fds) fds_to_keep.add(errpipe_write) self.pid = _posixsubprocess.fork_exec( args, executable_list, close_fds, tuple(sorted(map(int, fds_to_keep))), cwd, env_list, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, errpipe_read, errpipe_write, restore_signals, start_new_session, preexec_fn) self._child_created = True finally: # be sure the FD is closed no matter what os.close(errpipe_write) self._close_pipe_fds(p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite) # Wait for exec to fail or succeed; possibly raising an # exception (limited in size) errpipe_data = bytearray() while True: part = os.read(errpipe_read, 50000) errpipe_data += part if not part or len(errpipe_data) > 50000: break finally: # be sure the FD is closed no matter what os.close(errpipe_read) if errpipe_data: try: pid, sts = os.waitpid(self.pid, 0) if pid == self.pid: self._handle_exitstatus(sts) else: self.returncode = sys.maxsize except ChildProcessError: pass try: exception_name, hex_errno, err_msg = ( errpipe_data.split(b':', 2)) # The encoding here should match the encoding # written in by the subprocess implementations # like _posixsubprocess err_msg = err_msg.decode() except ValueError: exception_name = b'SubprocessError' hex_errno = b'0' err_msg = 'Bad exception data from child: {!r}'.format( bytes(errpipe_data)) child_exception_type = getattr( builtins, exception_name.decode('ascii'), SubprocessError) if issubclass(child_exception_type, OSError) and hex_errno: errno_num = int(hex_errno, 16) child_exec_never_called = (err_msg == "noexec") if child_exec_never_called: err_msg = "" # The error must be from chdir(cwd). err_filename = cwd else: err_filename = orig_executable if errno_num != 0: err_msg = os.strerror(errno_num) > raise child_exception_type(errno_num, err_msg, err_filename) E FileNotFoundError: [Errno 2] No such file or directory: 'mpirun' /opt/python/3.8.0/lib/python3.8/subprocess.py:1702: FileNotFoundError ----------------------------- Captured stdout call ----------------------------- running: mpirun -n 2 /tmp/tmprhq4wk8a/pytest-mpi-0.4/.tox/py38/bin/python -mpytest --basetemp=/tmp/pytest-of-travis/pytest-37/test_mpi_only_mpi0/runpytest-0 --only-mpi in: /tmp/pytest-of-travis/pytest-37/test_mpi_only_mpi0 ___________________________ test_mpi_skip_under_mpi ____________________________ mpi_testdir = def test_mpi_skip_under_mpi(mpi_testdir): mpi_testdir.makepyfile(MPI_SKIP_TEST_CODE) > result = mpi_testdir.runpytest("--with-mpi") /tmp/tmprhq4wk8a/pytest-mpi-0.4/tests/test_markers.py:97: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /tmp/tmprhq4wk8a/pytest-mpi-0.4/tests/conftest.py:52: in runpytest return self.runpytest_subprocess(*args, **kwargs) /tmp/tmprhq4wk8a/pytest-mpi-0.4/tests/conftest.py:44: in runpytest_subprocess return self.run(*args, timeout=timeout) /tmp/tmprhq4wk8a/pytest-mpi-0.4/.tox/py38/lib/python3.8/site-packages/_pytest/pytester.py:1193: in popen popen = subprocess.Popen(cmdargs, stdout=stdout, stderr=stderr, **kw) /opt/python/3.8.0/lib/python3.8/subprocess.py:854: in __init__ self._execute_child(args, executable, preexec_fn, close_fds, _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = args = ['mpirun', '-n', '2', '/tmp/tmprhq4wk8a/pytest-mpi-0.4/.tox/py38/bin/python', '-mpytest', '--basetemp=/tmp/pytest-of-travis/pytest-37/test_mpi_skip_under_mpi0/runpytest-0', ...] executable = b'mpirun', preexec_fn = None, close_fds = True, pass_fds = () cwd = None env = {'COV_CORE_CONFIG': ':', 'COV_CORE_DATAFILE': '/tmp/tmprhq4wk8a/pytest-mpi-0.4/.coverage', 'COV_CORE_SOURCE': '/tmp/tm.../py38/lib/python3.8/site-packages/pytest_mpi', 'HOME': '/tmp/pytest-of-travis/pytest-37/test_mpi_skip_under_mpi0', ...} startupinfo = None, creationflags = 0, shell = False, p2cread = 13 p2cwrite = 14, c2pread = -1, c2pwrite = 11, errread = -1, errwrite = 12 restore_signals = True, start_new_session = False def _execute_child(self, args, executable, preexec_fn, close_fds, pass_fds, cwd, env, startupinfo, creationflags, shell, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, restore_signals, start_new_session): """Execute program (POSIX version)""" if isinstance(args, (str, bytes)): args = [args] elif isinstance(args, os.PathLike): if shell: raise TypeError('path-like args is not allowed when ' 'shell is true') args = [args] else: args = list(args) if shell: # On Android the default shell is at '/system/bin/sh'. unix_shell = ('/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh') args = [unix_shell, "-c"] + args if executable: args[0] = executable if executable is None: executable = args[0] sys.audit("subprocess.Popen", executable, args, cwd, env) if (_USE_POSIX_SPAWN and os.path.dirname(executable) and preexec_fn is None and not close_fds and not pass_fds and cwd is None and (p2cread == -1 or p2cread > 2) and (c2pwrite == -1 or c2pwrite > 2) and (errwrite == -1 or errwrite > 2) and not start_new_session): self._posix_spawn(args, executable, env, restore_signals, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite) return orig_executable = executable # For transferring possible exec failure from child to parent. # Data format: "exception name:hex errno:description" # Pickle is not used; it is complex and involves memory allocation. errpipe_read, errpipe_write = os.pipe() # errpipe_write must not be in the standard io 0, 1, or 2 fd range. low_fds_to_close = [] while errpipe_write < 3: low_fds_to_close.append(errpipe_write) errpipe_write = os.dup(errpipe_write) for low_fd in low_fds_to_close: os.close(low_fd) try: try: # We must avoid complex work that could involve # malloc or free in the child process to avoid # potential deadlocks, thus we do all this here. # and pass it to fork_exec() if env is not None: env_list = [] for k, v in env.items(): k = os.fsencode(k) if b'=' in k: raise ValueError("illegal environment variable name") env_list.append(k + b'=' + os.fsencode(v)) else: env_list = None # Use execv instead of execve. executable = os.fsencode(executable) if os.path.dirname(executable): executable_list = (executable,) else: # This matches the behavior of os._execvpe(). executable_list = tuple( os.path.join(os.fsencode(dir), executable) for dir in os.get_exec_path(env)) fds_to_keep = set(pass_fds) fds_to_keep.add(errpipe_write) self.pid = _posixsubprocess.fork_exec( args, executable_list, close_fds, tuple(sorted(map(int, fds_to_keep))), cwd, env_list, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, errpipe_read, errpipe_write, restore_signals, start_new_session, preexec_fn) self._child_created = True finally: # be sure the FD is closed no matter what os.close(errpipe_write) self._close_pipe_fds(p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite) # Wait for exec to fail or succeed; possibly raising an # exception (limited in size) errpipe_data = bytearray() while True: part = os.read(errpipe_read, 50000) errpipe_data += part if not part or len(errpipe_data) > 50000: break finally: # be sure the FD is closed no matter what os.close(errpipe_read) if errpipe_data: try: pid, sts = os.waitpid(self.pid, 0) if pid == self.pid: self._handle_exitstatus(sts) else: self.returncode = sys.maxsize except ChildProcessError: pass try: exception_name, hex_errno, err_msg = ( errpipe_data.split(b':', 2)) # The encoding here should match the encoding # written in by the subprocess implementations # like _posixsubprocess err_msg = err_msg.decode() except ValueError: exception_name = b'SubprocessError' hex_errno = b'0' err_msg = 'Bad exception data from child: {!r}'.format( bytes(errpipe_data)) child_exception_type = getattr( builtins, exception_name.decode('ascii'), SubprocessError) if issubclass(child_exception_type, OSError) and hex_errno: errno_num = int(hex_errno, 16) child_exec_never_called = (err_msg == "noexec") if child_exec_never_called: err_msg = "" # The error must be from chdir(cwd). err_filename = cwd else: err_filename = orig_executable if errno_num != 0: err_msg = os.strerror(errno_num) > raise child_exception_type(errno_num, err_msg, err_filename) E FileNotFoundError: [Errno 2] No such file or directory: 'mpirun' /opt/python/3.8.0/lib/python3.8/subprocess.py:1702: FileNotFoundError ----------------------------- Captured stdout call ----------------------------- running: mpirun -n 2 /tmp/tmprhq4wk8a/pytest-mpi-0.4/.tox/py38/bin/python -mpytest --basetemp=/tmp/pytest-of-travis/pytest-37/test_mpi_skip_under_mpi0/runpytest-0 --with-mpi in: /tmp/pytest-of-travis/pytest-37/test_mpi_skip_under_mpi0 ___________________________ test_mpi_xfail_under_mpi ___________________________ mpi_testdir = has_mpi4py = False def test_mpi_xfail_under_mpi(mpi_testdir, has_mpi4py): mpi_testdir.makepyfile(MPI_XFAIL_TEST_CODE) > result = mpi_testdir.runpytest("--with-mpi") /tmp/tmprhq4wk8a/pytest-mpi-0.4/tests/test_markers.py:113: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /tmp/tmprhq4wk8a/pytest-mpi-0.4/tests/conftest.py:52: in runpytest return self.runpytest_subprocess(*args, **kwargs) /tmp/tmprhq4wk8a/pytest-mpi-0.4/tests/conftest.py:44: in runpytest_subprocess return self.run(*args, timeout=timeout) /tmp/tmprhq4wk8a/pytest-mpi-0.4/.tox/py38/lib/python3.8/site-packages/_pytest/pytester.py:1193: in popen popen = subprocess.Popen(cmdargs, stdout=stdout, stderr=stderr, **kw) /opt/python/3.8.0/lib/python3.8/subprocess.py:854: in __init__ self._execute_child(args, executable, preexec_fn, close_fds, _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = args = ['mpirun', '-n', '2', '/tmp/tmprhq4wk8a/pytest-mpi-0.4/.tox/py38/bin/python', '-mpytest', '--basetemp=/tmp/pytest-of-travis/pytest-37/test_mpi_xfail_under_mpi0/runpytest-0', ...] executable = b'mpirun', preexec_fn = None, close_fds = True, pass_fds = () cwd = None env = {'COV_CORE_CONFIG': ':', 'COV_CORE_DATAFILE': '/tmp/tmprhq4wk8a/pytest-mpi-0.4/.coverage', 'COV_CORE_SOURCE': '/tmp/tm...py38/lib/python3.8/site-packages/pytest_mpi', 'HOME': '/tmp/pytest-of-travis/pytest-37/test_mpi_xfail_under_mpi0', ...} startupinfo = None, creationflags = 0, shell = False, p2cread = 13 p2cwrite = 14, c2pread = -1, c2pwrite = 11, errread = -1, errwrite = 12 restore_signals = True, start_new_session = False def _execute_child(self, args, executable, preexec_fn, close_fds, pass_fds, cwd, env, startupinfo, creationflags, shell, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, restore_signals, start_new_session): """Execute program (POSIX version)""" if isinstance(args, (str, bytes)): args = [args] elif isinstance(args, os.PathLike): if shell: raise TypeError('path-like args is not allowed when ' 'shell is true') args = [args] else: args = list(args) if shell: # On Android the default shell is at '/system/bin/sh'. unix_shell = ('/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh') args = [unix_shell, "-c"] + args if executable: args[0] = executable if executable is None: executable = args[0] sys.audit("subprocess.Popen", executable, args, cwd, env) if (_USE_POSIX_SPAWN and os.path.dirname(executable) and preexec_fn is None and not close_fds and not pass_fds and cwd is None and (p2cread == -1 or p2cread > 2) and (c2pwrite == -1 or c2pwrite > 2) and (errwrite == -1 or errwrite > 2) and not start_new_session): self._posix_spawn(args, executable, env, restore_signals, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite) return orig_executable = executable # For transferring possible exec failure from child to parent. # Data format: "exception name:hex errno:description" # Pickle is not used; it is complex and involves memory allocation. errpipe_read, errpipe_write = os.pipe() # errpipe_write must not be in the standard io 0, 1, or 2 fd range. low_fds_to_close = [] while errpipe_write < 3: low_fds_to_close.append(errpipe_write) errpipe_write = os.dup(errpipe_write) for low_fd in low_fds_to_close: os.close(low_fd) try: try: # We must avoid complex work that could involve # malloc or free in the child process to avoid # potential deadlocks, thus we do all this here. # and pass it to fork_exec() if env is not None: env_list = [] for k, v in env.items(): k = os.fsencode(k) if b'=' in k: raise ValueError("illegal environment variable name") env_list.append(k + b'=' + os.fsencode(v)) else: env_list = None # Use execv instead of execve. executable = os.fsencode(executable) if os.path.dirname(executable): executable_list = (executable,) else: # This matches the behavior of os._execvpe(). executable_list = tuple( os.path.join(os.fsencode(dir), executable) for dir in os.get_exec_path(env)) fds_to_keep = set(pass_fds) fds_to_keep.add(errpipe_write) self.pid = _posixsubprocess.fork_exec( args, executable_list, close_fds, tuple(sorted(map(int, fds_to_keep))), cwd, env_list, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, errpipe_read, errpipe_write, restore_signals, start_new_session, preexec_fn) self._child_created = True finally: # be sure the FD is closed no matter what os.close(errpipe_write) self._close_pipe_fds(p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite) # Wait for exec to fail or succeed; possibly raising an # exception (limited in size) errpipe_data = bytearray() while True: part = os.read(errpipe_read, 50000) errpipe_data += part if not part or len(errpipe_data) > 50000: break finally: # be sure the FD is closed no matter what os.close(errpipe_read) if errpipe_data: try: pid, sts = os.waitpid(self.pid, 0) if pid == self.pid: self._handle_exitstatus(sts) else: self.returncode = sys.maxsize except ChildProcessError: pass try: exception_name, hex_errno, err_msg = ( errpipe_data.split(b':', 2)) # The encoding here should match the encoding # written in by the subprocess implementations # like _posixsubprocess err_msg = err_msg.decode() except ValueError: exception_name = b'SubprocessError' hex_errno = b'0' err_msg = 'Bad exception data from child: {!r}'.format( bytes(errpipe_data)) child_exception_type = getattr( builtins, exception_name.decode('ascii'), SubprocessError) if issubclass(child_exception_type, OSError) and hex_errno: errno_num = int(hex_errno, 16) child_exec_never_called = (err_msg == "noexec") if child_exec_never_called: err_msg = "" # The error must be from chdir(cwd). err_filename = cwd else: err_filename = orig_executable if errno_num != 0: err_msg = os.strerror(errno_num) > raise child_exception_type(errno_num, err_msg, err_filename) E FileNotFoundError: [Errno 2] No such file or directory: 'mpirun' /opt/python/3.8.0/lib/python3.8/subprocess.py:1702: FileNotFoundError ----------------------------- Captured stdout call ----------------------------- running: mpirun -n 2 /tmp/tmprhq4wk8a/pytest-mpi-0.4/.tox/py38/bin/python -mpytest --basetemp=/tmp/pytest-of-travis/pytest-37/test_mpi_xfail_under_mpi0/runpytest-0 --with-mpi in: /tmp/pytest-of-travis/pytest-37/test_mpi_xfail_under_mpi0 ----------- coverage: platform linux, python 3.8.0-final-0 ----------- Name Stmts Miss Cover ---------------------------------------------------------------------------------- .tox/py38/lib/python3.8/site-packages/pytest_mpi/__init__.py 112 61 46% .tox/py38/lib/python3.8/site-packages/pytest_mpi/_version.py 4 0 100% ---------------------------------------------------------------------------------- TOTAL 116 61 47% =========================== short test summary info ============================ FAILED tests/test_fixtures.py::test_mpi_file_name - FileNotFoundError: [Errno... FAILED tests/test_fixtures.py::test_mpi_tmpdir - FileNotFoundError: [Errno 2]... FAILED tests/test_fixtures.py::test_mpi_tmp_path - FileNotFoundError: [Errno ... FAILED tests/test_markers.py::test_mpi_with_mpi - FileNotFoundError: [Errno 2... FAILED tests/test_markers.py::test_mpi_only_mpi - FileNotFoundError: [Errno 2... FAILED tests/test_markers.py::test_mpi_skip_under_mpi - FileNotFoundError: [E... FAILED tests/test_markers.py::test_mpi_xfail_under_mpi - FileNotFoundError: [... ========================= 7 failed, 6 passed in 15.14s ========================= ERROR: InvocationError for command /tmp/tmprhq4wk8a/pytest-mpi-0.4/.tox/py38/bin/py.test -p pytester --cov=/tmp/tmprhq4wk8a/pytest-mpi-0.4/.tox/py38/lib/python3.8/site-packages/pytest_mpi --runpytest=subprocess (exited with code 1) ___________________________________ summary ____________________________________ ERROR: py38: commands failed write json report at: /tmp/tmprhq4wk8a/pytest-mpi-0.4/result.json Time: 51.3 seconds