| """Utility for changing directories and execution of commands in a subshell.""" | 
 |  | 
 | import os | 
 | import shlex | 
 | import subprocess | 
 |  | 
 | # Store the previous working directory for the 'cd -' command. | 
 |  | 
 |  | 
 | class Holder: | 
 |     """Holds the _prev_dir_ class attribute for chdir() function.""" | 
 |     _prev_dir_ = None | 
 |  | 
 |     @classmethod | 
 |     def prev_dir(cls): | 
 |         return cls._prev_dir_ | 
 |  | 
 |     @classmethod | 
 |     def swap(cls, dir): | 
 |         cls._prev_dir_ = dir | 
 |  | 
 |  | 
 | def chdir(debugger, args, result, dict): | 
 |     """Change the working directory, or cd to ${HOME}. | 
 |     You can also issue 'cd -' to change to the previous working directory.""" | 
 |     new_dir = args.strip() | 
 |     if not new_dir: | 
 |         new_dir = os.path.expanduser('~') | 
 |     elif new_dir == '-': | 
 |         if not Holder.prev_dir(): | 
 |             # Bad directory, not changing. | 
 |             print "bad directory, not changing" | 
 |             return | 
 |         else: | 
 |             new_dir = Holder.prev_dir() | 
 |  | 
 |     Holder.swap(os.getcwd()) | 
 |     os.chdir(new_dir) | 
 |     print "Current working directory: %s" % os.getcwd() | 
 |  | 
 |  | 
 | def system(debugger, command_line, result, dict): | 
 |     """Execute the command (a string) in a subshell.""" | 
 |     args = shlex.split(command_line) | 
 |     process = subprocess.Popen( | 
 |         args, | 
 |         stdout=subprocess.PIPE, | 
 |         stderr=subprocess.PIPE) | 
 |     output, error = process.communicate() | 
 |     retcode = process.poll() | 
 |     if output and error: | 
 |         print "stdout=>\n", output | 
 |         print "stderr=>\n", error | 
 |     elif output: | 
 |         print output | 
 |     elif error: | 
 |         print error | 
 |     print "retcode:", retcode |