◐ Shell
clean mode source ↗

bpo-35674: Expose posix_spawnp by saraharkam · Pull Request #11545 · python/cpython


    err_code = posix_spawn(&pid, path->narrow,
    if(use_posixspawnp){
                           file_actionsp, attrp, argvlist, envlist);
        err_code = posix_spawn(&pid, path->narrow,
                               file_actionsp, attrp, argvlist, envlist);
    }
    else {
        err_code = posix_spawnp(&pid, path->narrow,
                                file_actionsp, attrp, argvlist, envlist);
    }
     @support.skip_unless_symlink
    def test_posix_spawnp(self):
        # Use a symlink to create a program in its own temporary directory
        temp_dir = tempfile.mkdtemp()
        self.addCleanup(support.rmtree, temp_dir)

        program = 'posix_spawnp_test_program.exe'
        program_fullpath = os.path.join(temp_dir, program)
        os.symlink(sys.executable, program_fullpath)

        path = os.environ.get('PATH', '')
        path = os.pathsep.join((temp_dir, path))
        env = dict(os.environ, PATH=path)

        spawn_args = (program, '-I', '-S', '-c', 'pass')
        code = textwrap.dedent("""
            import os
            args = %a
            env = %a
            pid = os.posix_spawnp(args[0], args, env)
            pid2, status = os.waitpid(pid, 0)
            if pid2 != pid:
                raise Exception(f"pid {pid2} != {pid}")
            if status != 0:
                raise Exception(f"status = {status}")
        """ % (spawn_args, env))

        # Use a subprocess to test os.posix_spawnp() with a modified PATH
        # environment variable: posix_spawnp() uses the current environment
        # to locate the program, not its environment argument.
        args = ('-c', code)
        assert_python_ok(*args, PATH=path)