Example #1
0
	def maybeCallProcessEnded(self):
		if self.closedNotifies == 3 and self.lostProcess:
			win32file.CloseHandle(self.hProcess)
			win32file.CloseHandle(self.hThread)
			self.hProcess = None
			self.hThread = None
			BaseProcess.maybeCallProcessEnded(self)
Example #2
0
 def maybeCallProcessEnded(self):
     if self.closedNotifies == 3 and self.lostProcess:
         win32file.CloseHandle(self.hProcess)
         win32file.CloseHandle(self.hThread)
         self.hProcess = None
         self.hThread = None
         BaseProcess.maybeCallProcessEnded(self)
Example #3
0
	def __init__(self, reactor, protocol, command, args, environment, path):
		_pollingfile._PollingTimer.__init__(self, reactor)
		BaseProcess.__init__(self, protocol)

		# security attributes for pipes
		sAttrs = win32security.SECURITY_ATTRIBUTES()
		sAttrs.bInheritHandle = 1

		# create the pipes which will connect to the secondary process
		self.hStdoutR, hStdoutW = win32pipe.CreatePipe(sAttrs, 0)
		self.hStderrR, hStderrW = win32pipe.CreatePipe(sAttrs, 0)
		hStdinR,  self.hStdinW  = win32pipe.CreatePipe(sAttrs, 0)

		win32pipe.SetNamedPipeHandleState(self.hStdinW,
										  win32pipe.PIPE_NOWAIT,
										  None,
										  None)

		# set the info structure for the new process.
		StartupInfo = win32process.STARTUPINFO()
		StartupInfo.hStdOutput = hStdoutW
		StartupInfo.hStdError  = hStderrW
		StartupInfo.hStdInput  = hStdinR
		StartupInfo.dwFlags = win32process.STARTF_USESTDHANDLES

		# Create new handles whose inheritance property is false
		currentPid = win32api.GetCurrentProcess()

		tmp = win32api.DuplicateHandle(currentPid, self.hStdoutR, currentPid, 0, 0,
									   win32con.DUPLICATE_SAME_ACCESS)
		win32file.CloseHandle(self.hStdoutR)
		self.hStdoutR = tmp

		tmp = win32api.DuplicateHandle(currentPid, self.hStderrR, currentPid, 0, 0,
									   win32con.DUPLICATE_SAME_ACCESS)
		win32file.CloseHandle(self.hStderrR)
		self.hStderrR = tmp

		tmp = win32api.DuplicateHandle(currentPid, self.hStdinW, currentPid, 0, 0,
									   win32con.DUPLICATE_SAME_ACCESS)
		win32file.CloseHandle(self.hStdinW)
		self.hStdinW = tmp

		# Add the specified environment to the current environment - this is
		# necessary because certain operations are only supported on Windows
		# if certain environment variables are present.

		env = os.environ.copy()
		env.update(environment or {})

		cmdline = quoteArguments(args)
		# TODO: error detection here.
		def doCreate():
			self.hProcess, self.hThread, self.pid, dwTid = win32process.CreateProcess(
				command, cmdline, None, None, 1, 0, env, path, StartupInfo)
		try:
			doCreate()
		except pywintypes.error, pwte:
			if not _invalidWin32App(pwte):
				# This behavior isn't _really_ documented, but let's make it
				# consistent with the behavior that is documented.
				raise OSError(pwte)
			else:
				# look for a shebang line.  Insert the original 'command'
				# (actually a script) into the new arguments list.
				sheb = _findShebang(command)
				if sheb is None:
					raise OSError(
						"%r is neither a Windows executable, "
						"nor a script with a shebang line" % command)
				else:
					args = list(args)
					args.insert(0, command)
					cmdline = quoteArguments(args)
					origcmd = command
					command = sheb
					try:
						# Let's try again.
						doCreate()
					except pywintypes.error, pwte2:
						# d'oh, failed again!
						if _invalidWin32App(pwte2):
							raise OSError(
								"%r has an invalid shebang line: "
								"%r is not a valid executable" % (
									origcmd, sheb))
						raise OSError(pwte2)
Example #4
0
    def __init__(self, reactor, protocol, command, args, environment, path):
        _pollingfile._PollingTimer.__init__(self, reactor)
        BaseProcess.__init__(self, protocol)

        # security attributes for pipes
        sAttrs = win32security.SECURITY_ATTRIBUTES()
        sAttrs.bInheritHandle = 1

        # create the pipes which will connect to the secondary process
        self.hStdoutR, hStdoutW = win32pipe.CreatePipe(sAttrs, 0)
        self.hStderrR, hStderrW = win32pipe.CreatePipe(sAttrs, 0)
        hStdinR, self.hStdinW = win32pipe.CreatePipe(sAttrs, 0)

        win32pipe.SetNamedPipeHandleState(self.hStdinW, win32pipe.PIPE_NOWAIT,
                                          None, None)

        # set the info structure for the new process.
        StartupInfo = win32process.STARTUPINFO()
        StartupInfo.hStdOutput = hStdoutW
        StartupInfo.hStdError = hStderrW
        StartupInfo.hStdInput = hStdinR
        StartupInfo.dwFlags = win32process.STARTF_USESTDHANDLES

        # Create new handles whose inheritance property is false
        currentPid = win32api.GetCurrentProcess()

        tmp = win32api.DuplicateHandle(currentPid, self.hStdoutR, currentPid,
                                       0, 0, win32con.DUPLICATE_SAME_ACCESS)
        win32file.CloseHandle(self.hStdoutR)
        self.hStdoutR = tmp

        tmp = win32api.DuplicateHandle(currentPid, self.hStderrR, currentPid,
                                       0, 0, win32con.DUPLICATE_SAME_ACCESS)
        win32file.CloseHandle(self.hStderrR)
        self.hStderrR = tmp

        tmp = win32api.DuplicateHandle(currentPid, self.hStdinW, currentPid, 0,
                                       0, win32con.DUPLICATE_SAME_ACCESS)
        win32file.CloseHandle(self.hStdinW)
        self.hStdinW = tmp

        # Add the specified environment to the current environment - this is
        # necessary because certain operations are only supported on Windows
        # if certain environment variables are present.

        env = os.environ.copy()
        env.update(environment or {})

        cmdline = quoteArguments(args)

        # TODO: error detection here.
        def doCreate():
            self.hProcess, self.hThread, self.pid, dwTid = win32process.CreateProcess(
                command, cmdline, None, None, 1, 0, env, path, StartupInfo)

        try:
            doCreate()
        except pywintypes.error, pwte:
            if not _invalidWin32App(pwte):
                # This behavior isn't _really_ documented, but let's make it
                # consistent with the behavior that is documented.
                raise OSError(pwte)
            else:
                # look for a shebang line.  Insert the original 'command'
                # (actually a script) into the new arguments list.
                sheb = _findShebang(command)
                if sheb is None:
                    raise OSError("%r is neither a Windows executable, "
                                  "nor a script with a shebang line" % command)
                else:
                    args = list(args)
                    args.insert(0, command)
                    cmdline = quoteArguments(args)
                    origcmd = command
                    command = sheb
                    try:
                        # Let's try again.
                        doCreate()
                    except pywintypes.error, pwte2:
                        # d'oh, failed again!
                        if _invalidWin32App(pwte2):
                            raise OSError("%r has an invalid shebang line: "
                                          "%r is not a valid executable" %
                                          (origcmd, sheb))
                        raise OSError(pwte2)