docs: def start(self, *args, **kwargs):
          '''
          Launch IPython notebook server in background process.
  
          Arguments and keyword arguments are passed on to `Popen` call.
  
          By default, notebook server is launched using current working directory
          as the notebook directory.
          '''
          if 'stderr' in kwargs:
              raise ValueError('`stderr` must not be specified, since it must be'
                               ' monitored to determine which port the notebook '
                               'server is running on.')
          args_ = ('%s' % sys.executable, '-m', 'IPython', 'notebook') + self.args
          args_ = args_ + tuple(args)
          self.process = Popen(args_, stderr=PIPE, **kwargs)
          self._notebook_dir = os.getcwd()
  
          # Determine which port the notebook is running on.
          cre_address = re.compile(r'The \w+ Notebook is running at: '
                                   r'(?P<address>https?://.*?:'
                                   r'(?P<port>\d+)[^\r]*/)\r?$')
          cre_notebook_dir = re.compile(r'Serving notebooks from local '
                                        r'directory:\s+(?P<notebook_dir>[^\r]*)\r?$')
          match = None
          self.stderr_lines = []
  
          while not self.process.poll() and match is None:
              stderr_line = self.process.stderr.readline()
              self.stderr_lines.append(stderr_line)
              match = cre_address.search(stderr_line)
              dir_match = cre_notebook_dir.search(stderr_line)
              if dir_match:
                  self._notebook_dir = dir_match.group('notebook_dir')
  
          if match:
              # Notebook was started successfully.
              self.address = match.group('address')
              self.port = int(match.group('port'))
          else:
              raise IOError(''.join(self.stderr_lines))