(self)
| 440 | return [sys.executable] + w + ["-c", command, str(self.port)] |
| 441 | |
| 442 | def start_subprocess(self): |
| 443 | addr = (HOST, self.port) |
| 444 | # GUI makes several attempts to acquire socket, listens for connection |
| 445 | for i in range(3): |
| 446 | time.sleep(i) |
| 447 | try: |
| 448 | self.rpcclt = MyRPCClient(addr) |
| 449 | break |
| 450 | except OSError: |
| 451 | pass |
| 452 | else: |
| 453 | self.display_port_binding_error() |
| 454 | return None |
| 455 | # if PORT was 0, system will assign an 'ephemeral' port. Find it out: |
| 456 | self.port = self.rpcclt.listening_sock.getsockname()[1] |
| 457 | # if PORT was not 0, probably working with a remote execution server |
| 458 | if PORT != 0: |
| 459 | # To allow reconnection within the 2MSL wait (cf. Stevens TCP |
| 460 | # V1, 18.6), set SO_REUSEADDR. Note that this can be problematic |
| 461 | # on Windows since the implementation allows two active sockets on |
| 462 | # the same address! |
| 463 | self.rpcclt.listening_sock.setsockopt(socket.SOL_SOCKET, |
| 464 | socket.SO_REUSEADDR, 1) |
| 465 | self.spawn_subprocess() |
| 466 | #time.sleep(20) # test to simulate GUI not accepting connection |
| 467 | # Accept the connection from the Python execution server |
| 468 | self.rpcclt.listening_sock.settimeout(10) |
| 469 | try: |
| 470 | self.rpcclt.accept() |
| 471 | except TimeoutError: |
| 472 | self.display_no_subprocess_error() |
| 473 | return None |
| 474 | self.rpcclt.register("console", self.tkconsole) |
| 475 | self.rpcclt.register("stdin", self.tkconsole.stdin) |
| 476 | self.rpcclt.register("stdout", self.tkconsole.stdout) |
| 477 | self.rpcclt.register("stderr", self.tkconsole.stderr) |
| 478 | self.rpcclt.register("flist", self.tkconsole.flist) |
| 479 | self.rpcclt.register("linecache", linecache) |
| 480 | self.rpcclt.register("interp", self) |
| 481 | self.transfer_path(with_cwd=True) |
| 482 | self.poll_subprocess() |
| 483 | return self.rpcclt |
| 484 | |
| 485 | def restart_subprocess(self, with_cwd=False, filename=''): |
| 486 | if self.restarting: |
no test coverage detected