def spawn_shell(self, context_file, tmpdir, rcfile=None, norc=False, stdin=False, command=None, env=None, quiet=False, pre_command=None, **Popen_args): startup_sequence = self.get_startup_sequence(rcfile, norc, bool(stdin), command) shell_command = None def _record_shell(ex, files, bind_rez=True, print_msg=False): ex.source(context_file) if startup_sequence["envvar"]: ex.unsetenv(startup_sequence["envvar"]) if bind_rez: ex.interpreter._bind_interactive_rez() if print_msg and not quiet: ex.info('You are now in a rez-configured environment.') # Rez may not be available. # Or it may not have an associated Python interpreter # available, in which case the command will succeed # but output to stderr, muted with 2>$null ex.command("Try { rez context 2>$null } Catch { }") executor = RexExecutor(interpreter=self.new_shell(), parent_environ={}, add_default_namespaces=False) if startup_sequence["command"] is not None: _record_shell(executor, files=startup_sequence["files"]) shell_command = startup_sequence["command"] else: _record_shell(executor, files=startup_sequence["files"], print_msg=(not quiet)) if shell_command: executor.command(shell_command) # Forward exit call to parent PowerShell process executor.command("exit $LastExitCode") code = executor.get_output() target_file = os.path.join(tmpdir, "rez-shell.%s" % self.file_extension()) with open(target_file, 'w') as f: f.write(code) cmd = [] if pre_command: cmd = pre_command if not isinstance(cmd, (tuple, list)): cmd = pre_command.rstrip().split() cmd += [ self.executable, "-NoLogo ", # Prevent custom user profile from leaking into # the resulting environment. "-NoProfile ", # Establish a session within which arbitrary # PowerShell scripts may be run. "-ExecutionPolicy", "Unrestricted", # Start from this script '. "{}"'.format(target_file) ] if shell_command is None: cmd.insert(1, "-NoExit") # No environment was explicity passed if not env and not config.inherit_parent_environment: env = self.environment() p = popen(cmd, env=env, universal_newlines=True, **Popen_args) return p
def spawn_shell(self, context_file, tmpdir, rcfile=None, norc=False, stdin=False, command=None, env=None, quiet=False, pre_command=None, **Popen_args): startup_sequence = self.get_startup_sequence(rcfile, norc, bool(stdin), command) shell_command = None def _record_shell(ex, files, bind_rez=True, print_msg=False): ex.source(context_file) if startup_sequence["envvar"]: ex.unsetenv(startup_sequence["envvar"]) if bind_rez: ex.interpreter._bind_interactive_rez() if print_msg and not quiet: # Rez may not be available ex.command("Try { rez context } Catch { }") executor = RexExecutor(interpreter=self.new_shell(), parent_environ={}, add_default_namespaces=False) if startup_sequence["command"] is not None: _record_shell(executor, files=startup_sequence["files"]) shell_command = startup_sequence["command"] else: _record_shell(executor, files=startup_sequence["files"], print_msg=(not quiet)) self._additional_commands(executor) if shell_command: executor.command(shell_command) # Forward exit call to parent PowerShell process executor.command("exit $LastExitCode") code = executor.get_output() target_file = os.path.join(tmpdir, "rez-shell.%s" % self.file_extension()) with open(target_file, 'w') as f: f.write(code) cmd = [] if pre_command: cmd = pre_command if not isinstance(cmd, (tuple, list)): cmd = pre_command.rstrip().split() cmd += [self.executable] # Suppresses copyright message of PowerShell and pwsh cmd += ["-NoLogo"] # Generic form of sourcing that works in powershell and pwsh cmd += ["-File", target_file] if shell_command is None: cmd.insert(1, "-NoExit") p = popen(cmd, env=env, **Popen_args) return p