コード例 #1
0
ファイル: loader.py プロジェクト: andrewgiessel/ipython
 def _decode_argv(self, argv, enc=None):
     """decode argv if bytes, using stin.encoding, falling back on default enc"""
     uargv = []
     if enc is None:
         enc = text.getdefaultencoding()
     for arg in argv:
         if not isinstance(arg, unicode):
             # only decode if not already decoded
             arg = arg.decode(enc)
         uargv.append(arg)
     return uargv
コード例 #2
0
ファイル: loader.py プロジェクト: g2p/ipython
 def _decode_argv(self, argv, enc=None):
     """decode argv if bytes, using stin.encoding, falling back on default enc"""
     uargv = []
     if enc is None:
         enc = text.getdefaultencoding()
     for arg in argv:
         if not isinstance(arg, unicode):
             # only decode if not already decoded
             arg = arg.decode(enc)
         uargv.append(arg)
     return uargv
コード例 #3
0
ファイル: iostream.py プロジェクト: Tremere/ipython
 def write(self, string):
     if self.pub_socket is None:
         raise ValueError('I/O operation on closed file')
     else:
         # Make sure that we're handling unicode
         if not isinstance(string, unicode):
             enc = text.getdefaultencoding()
             string = string.decode(enc, 'replace')
         
         self._buffer.write(string)
         current_time = time.time()
         if self._start <= 0:
             self._start = current_time
         elif current_time - self._start > self.flush_interval:
             self.flush()
コード例 #4
0
ファイル: _process_posix.py プロジェクト: sratcliffe/ipython
    def system(self, cmd):
        """Execute a command in a subshell.

        Parameters
        ----------
        cmd : str
          A command to be executed in the system shell.

        Returns
        -------
        int : child's exitstatus
        """
        # Get likely encoding for the output.
        enc = text.getdefaultencoding()

        pcmd = self._make_cmd(cmd)
        # Patterns to match on the output, for pexpect.  We read input and
        # allow either a short timeout or EOF
        patterns = [pexpect.TIMEOUT, pexpect.EOF]
        # the index of the EOF pattern in the list.
        EOF_index = 1  # Fix this index if you change the list!!
        # The size of the output stored so far in the process output buffer.
        # Since pexpect only appends to this buffer, each time we print we
        # record how far we've printed, so that next time we only print *new*
        # content from the buffer.
        out_size = 0
        try:
            # Since we're not really searching the buffer for text patterns, we
            # can set pexpect's search window to be tiny and it won't matter.
            # We only search for the 'patterns' timeout or EOF, which aren't in
            # the text itself.
            #child = pexpect.spawn(pcmd, searchwindowsize=1)
            child = pexpect.spawn(pcmd)
            flush = sys.stdout.flush
            while True:
                # res is the index of the pattern that caused the match, so we
                # know whether we've finished (if we matched EOF) or not
                res_idx = child.expect_list(patterns, self.read_timeout)
                print(child.before[out_size:].decode(enc, 'replace'), end='')
                flush()
                if res_idx == EOF_index:
                    break
                # Update the pointer to what we've already printed
                out_size = len(child.before)
        except KeyboardInterrupt:
            # We need to send ^C to the process.  The ascii code for '^C' is 3
            # (the character is known as ETX for 'End of Text', see
            # curses.ascii.ETX).
            child.sendline(chr(3))
            # Read and print any more output the program might produce on its
            # way out.
            try:
                out_size = len(child.before)
                child.expect_list(patterns, self.terminate_timeout)
                print(child.before[out_size:].decode(enc, 'replace'), end='')
                sys.stdout.flush()
            except KeyboardInterrupt:
                # Impatient users tend to type it multiple times
                pass
            finally:
                # Ensure the subprocess really is terminated
                child.terminate(force=True)
        return child.exitstatus
コード例 #5
0
ファイル: _process_posix.py プロジェクト: stefanv/ipython
    def system(self, cmd):
        """Execute a command in a subshell.

        Parameters
        ----------
        cmd : str
          A command to be executed in the system shell.

        Returns
        -------
        int : child's exitstatus
        """
        # Get likely encoding for the output.
        enc = text.getdefaultencoding()
        
        # Patterns to match on the output, for pexpect.  We read input and
        # allow either a short timeout or EOF
        patterns = [pexpect.TIMEOUT, pexpect.EOF]
        # the index of the EOF pattern in the list.
        # even though we know it's 1, this call means we don't have to worry if
        # we change the above list, and forget to change this value:
        EOF_index = patterns.index(pexpect.EOF)
        # The size of the output stored so far in the process output buffer.
        # Since pexpect only appends to this buffer, each time we print we
        # record how far we've printed, so that next time we only print *new*
        # content from the buffer.
        out_size = 0
        try:
            # Since we're not really searching the buffer for text patterns, we
            # can set pexpect's search window to be tiny and it won't matter.
            # We only search for the 'patterns' timeout or EOF, which aren't in
            # the text itself.
            #child = pexpect.spawn(pcmd, searchwindowsize=1)
            if hasattr(pexpect, 'spawnb'):
                child = pexpect.spawnb(self.sh, args=['-c', cmd]) # Pexpect-U
            else:
                child = pexpect.spawn(self.sh, args=['-c', cmd])  # Vanilla Pexpect
            flush = sys.stdout.flush
            while True:
                # res is the index of the pattern that caused the match, so we
                # know whether we've finished (if we matched EOF) or not
                res_idx = child.expect_list(patterns, self.read_timeout)
                print(child.before[out_size:].decode(enc, 'replace'), end='')
                flush()
                if res_idx==EOF_index:
                    break
                # Update the pointer to what we've already printed
                out_size = len(child.before)
        except KeyboardInterrupt:
            # We need to send ^C to the process.  The ascii code for '^C' is 3
            # (the character is known as ETX for 'End of Text', see
            # curses.ascii.ETX).
            child.sendline(chr(3))
            # Read and print any more output the program might produce on its
            # way out.
            try:
                out_size = len(child.before)
                child.expect_list(patterns, self.terminate_timeout)
                print(child.before[out_size:].decode(enc, 'replace'), end='')
                sys.stdout.flush()
            except KeyboardInterrupt:
                # Impatient users tend to type it multiple times
                pass
            finally:
                # Ensure the subprocess really is terminated
                child.terminate(force=True)
        # add isalive check, to ensure exitstatus is set:
        child.isalive()
        return child.exitstatus
コード例 #6
0
ファイル: tools.py プロジェクト: g2p/ipython
 def write(self, s):
     s = py3compat.cast_unicode(s, encoding=getdefaultencoding())
     super(MyStringIO, self).write(s)
コード例 #7
0
ファイル: loader.py プロジェクト: andrewgiessel/ipython
 def _parse_args(self, args):
     """self.parser->self.parsed_data"""
     # decode sys.argv to support unicode command-line options
     enc = text.getdefaultencoding()
     uargs = [py3compat.cast_unicode(a, enc) for a in args]
     self.parsed_data, self.extra_args = self.parser.parse_known_args(uargs)
コード例 #8
0
ファイル: loader.py プロジェクト: g2p/ipython
 def _parse_args(self, args):
     """self.parser->self.parsed_data"""
     # decode sys.argv to support unicode command-line options
     enc = text.getdefaultencoding()
     uargs = [py3compat.cast_unicode(a, enc) for a in args]
     self.parsed_data, self.extra_args = self.parser.parse_known_args(uargs)
コード例 #9
0
ファイル: jsonutil.py プロジェクト: adgaudio/ipython
def json_clean(obj):
    """Clean an object to ensure it's safe to encode in JSON.
    
    Atomic, immutable objects are returned unmodified.  Sets and tuples are
    converted to lists, lists are copied and dicts are also copied.

    Note: dicts whose keys could cause collisions upon encoding (such as a dict
    with both the number 1 and the string '1' as keys) will cause a ValueError
    to be raised.

    Parameters
    ----------
    obj : any python object

    Returns
    -------
    out : object
    
      A version of the input which will not cause an encoding error when
      encoded as JSON.  Note that this function does not *encode* its inputs,
      it simply sanitizes it so that there will be no encoding errors later.

    Examples
    --------
    >>> json_clean(4)
    4
    >>> json_clean(range(10))
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> json_clean(dict(x=1, y=2))
    {'y': 2, 'x': 1}
    >>> json_clean(dict(x=1, y=2, z=[1,2,3]))
    {'y': 2, 'x': 1, 'z': [1, 2, 3]}
    >>> json_clean(True)
    True
    """
    # types that are 'atomic' and ok in json as-is.  bool doesn't need to be
    # listed explicitly because bools pass as int instances
    atomic_ok = (unicode, int, float, types.NoneType)
    
    # containers that we need to convert into lists
    container_to_list = (tuple, set, types.GeneratorType)
    
    if isinstance(obj, atomic_ok):
        return obj
    
    if isinstance(obj, bytes):
        return obj.decode(text.getdefaultencoding(), 'replace')
    
    if isinstance(obj, container_to_list) or (
        hasattr(obj, '__iter__') and hasattr(obj, next_attr_name)):
        obj = list(obj)
        
    if isinstance(obj, list):
        return [json_clean(x) for x in obj]

    if isinstance(obj, dict):
        # First, validate that the dict won't lose data in conversion due to
        # key collisions after stringification.  This can happen with keys like
        # True and 'true' or 1 and '1', which collide in JSON.
        nkeys = len(obj)
        nkeys_collapsed = len(set(map(str, obj)))
        if nkeys != nkeys_collapsed:
            raise ValueError('dict can not be safely converted to JSON: '
                             'key collision would lead to dropped values')
        # If all OK, proceed by making the new dict that will be json-safe
        out = {}
        for k,v in obj.iteritems():
            out[str(k)] = json_clean(v)
        return out

    # If we get here, we don't know how to handle the object, so we just get
    # its repr and return that.  This will catch lambdas, open sockets, class
    # objects, and any other complicated contraption that json can't encode
    return repr(obj)
コード例 #10
0
def json_clean(obj):
    """Clean an object to ensure it's safe to encode in JSON.
    
    Atomic, immutable objects are returned unmodified.  Sets and tuples are
    converted to lists, lists are copied and dicts are also copied.

    Note: dicts whose keys could cause collisions upon encoding (such as a dict
    with both the number 1 and the string '1' as keys) will cause a ValueError
    to be raised.

    Parameters
    ----------
    obj : any python object

    Returns
    -------
    out : object
    
      A version of the input which will not cause an encoding error when
      encoded as JSON.  Note that this function does not *encode* its inputs,
      it simply sanitizes it so that there will be no encoding errors later.

    Examples
    --------
    >>> json_clean(4)
    4
    >>> json_clean(range(10))
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> json_clean(dict(x=1, y=2))
    {'y': 2, 'x': 1}
    >>> json_clean(dict(x=1, y=2, z=[1,2,3]))
    {'y': 2, 'x': 1, 'z': [1, 2, 3]}
    >>> json_clean(True)
    True
    """
    # types that are 'atomic' and ok in json as-is.  bool doesn't need to be
    # listed explicitly because bools pass as int instances
    atomic_ok = (unicode, int, float, types.NoneType)

    # containers that we need to convert into lists
    container_to_list = (tuple, set, types.GeneratorType)

    if isinstance(obj, atomic_ok):
        return obj

    if isinstance(obj, bytes):
        return obj.decode(text.getdefaultencoding(), 'replace')

    if isinstance(obj,
                  container_to_list) or (hasattr(obj, '__iter__')
                                         and hasattr(obj, next_attr_name)):
        obj = list(obj)

    if isinstance(obj, list):
        return [json_clean(x) for x in obj]

    if isinstance(obj, dict):
        # First, validate that the dict won't lose data in conversion due to
        # key collisions after stringification.  This can happen with keys like
        # True and 'true' or 1 and '1', which collide in JSON.
        nkeys = len(obj)
        nkeys_collapsed = len(set(map(str, obj)))
        if nkeys != nkeys_collapsed:
            raise ValueError('dict can not be safely converted to JSON: '
                             'key collision would lead to dropped values')
        # If all OK, proceed by making the new dict that will be json-safe
        out = {}
        for k, v in obj.iteritems():
            out[str(k)] = json_clean(v)
        return out

    # If we get here, we don't know how to handle the object, so we just get
    # its repr and return that.  This will catch lambdas, open sockets, class
    # objects, and any other complicated contraption that json can't encode
    return repr(obj)