##// END OF EJS Templates
Take in account remarks by Fernando on code review
Take in account remarks by Fernando on code review

File last commit:

r1850:d536fe7e
r1947:3fc35df3
Show More
util.py
197 lines | 5.5 KiB | text/x-python | PythonLexer
# encoding: utf-8
__docformat__ = "restructuredtext en"
#-------------------------------------------------------------------------------
# Copyright (C) 2008 The IPython Development Team
#
# Distributed under the terms of the BSD License. The full license is in
# the file COPYING, distributed as part of this software.
#-------------------------------------------------------------------------------
#-------------------------------------------------------------------------------
# Imports
#-------------------------------------------------------------------------------
import os
import sys
# This class is mostly taken from IPython.
class InputList(list):
""" Class to store user input.
It's basically a list, but slices return a string instead of a list, thus
allowing things like (assuming 'In' is an instance):
exec In[4:7]
or
exec In[5:9] + In[14] + In[21:25]
"""
def __getslice__(self, i, j):
return ''.join(list.__getslice__(self, i, j))
def add(self, index, command):
""" Add a command to the list with the appropriate index.
If the index is greater than the current length of the list, empty
strings are added in between.
"""
length = len(self)
if length == index:
self.append(command)
elif length > index:
self[index] = command
else:
extras = index - length
self.extend([''] * extras)
self.append(command)
class Bunch(dict):
""" A dictionary that exposes its keys as attributes.
"""
def __init__(self, *args, **kwds):
dict.__init__(self, *args, **kwds)
self.__dict__ = self
def esc_quotes(strng):
""" Return the input string with single and double quotes escaped out.
"""
return strng.replace('"', '\\"').replace("'", "\\'")
def make_quoted_expr(s):
"""Return string s in appropriate quotes, using raw string if possible.
XXX - example removed because it caused encoding errors in documentation
generation. We need a new example that doesn't contain invalid chars.
Note the use of raw string and padding at the end to allow trailing
backslash.
"""
tail = ''
tailpadding = ''
raw = ''
if "\\" in s:
raw = 'r'
if s.endswith('\\'):
tail = '[:-1]'
tailpadding = '_'
if '"' not in s:
quote = '"'
elif "'" not in s:
quote = "'"
elif '"""' not in s and not s.endswith('"'):
quote = '"""'
elif "'''" not in s and not s.endswith("'"):
quote = "'''"
else:
# Give up, backslash-escaped string will do
return '"%s"' % esc_quotes(s)
res = ''.join([raw, quote, s, tailpadding, quote, tail])
return res
# This function is used by ipython in a lot of places to make system calls.
# We need it to be slightly different under win32, due to the vagaries of
# 'network shares'. A win32 override is below.
def system_shell(cmd, verbose=False, debug=False, header=''):
""" Execute a command in the system shell; always return None.
Parameters
----------
cmd : str
The command to execute.
verbose : bool
If True, print the command to be executed.
debug : bool
Only print, do not actually execute.
header : str
Header to print to screen prior to the executed command. No extra
newlines are added.
Description
-----------
This returns None so it can be conveniently used in interactive loops
without getting the return value (typically 0) printed many times.
"""
if verbose or debug:
print header + cmd
# Flush stdout so we don't mangle python's buffering.
sys.stdout.flush()
if not debug:
os.system(cmd)
# Override shell() for win32 to deal with network shares.
if os.name in ('nt', 'dos'):
system_shell_ori = system_shell
def system_shell(cmd, verbose=False, debug=False, header=''):
if os.getcwd().startswith(r"\\"):
path = os.getcwd()
# Change to c drive (cannot be on UNC-share when issuing os.system,
# as cmd.exe cannot handle UNC addresses).
os.chdir("c:")
# Issue pushd to the UNC-share and then run the command.
try:
system_shell_ori('"pushd %s&&"'%path+cmd,verbose,debug,header)
finally:
os.chdir(path)
else:
system_shell_ori(cmd,verbose,debug,header)
system_shell.__doc__ = system_shell_ori.__doc__
def getoutputerror(cmd, verbose=False, debug=False, header='', split=False):
""" Executes a command and returns the output.
Parameters
----------
cmd : str
The command to execute.
verbose : bool
If True, print the command to be executed.
debug : bool
Only print, do not actually execute.
header : str
Header to print to screen prior to the executed command. No extra
newlines are added.
split : bool
If True, return the output as a list split on newlines.
"""
if verbose or debug:
print header+cmd
if not cmd:
# Return empty lists or strings.
if split:
return [], []
else:
return '', ''
if not debug:
# fixme: use subprocess.
pin,pout,perr = os.popen3(cmd)
tout = pout.read().rstrip()
terr = perr.read().rstrip()
pin.close()
pout.close()
perr.close()
if split:
return tout.split('\n'), terr.split('\n')
else:
return tout, terr