''' This module will: - change the input() and raw_input() commands to change \r\n or \r into \n - execute the user site customize -- if available - change raw_input() and input() to also remove any trailing \r Up to PyDev 3.4 it also was setting the default encoding, but it was removed because of differences when running from a shell (i.e.: now we just set the PYTHONIOENCODING related to that -- which is properly treated on Py 2.7 onwards). ''' DEBUG = 0 #0 or 1 because of jython import sys encoding = None IS_PYTHON_3K = 0 try: if sys.version_info[0] == 3: IS_PYTHON_3K = 1 except: #That's OK, not all versions of python have sys.version_info if DEBUG: import traceback;traceback.print_exc() #@Reimport #----------------------------------------------------------------------------------------------------------------------- #Line buffering if IS_PYTHON_3K: #Python 3 has a bug (http://bugs.python.org/issue4705) in which -u doesn't properly make output/input unbuffered #so, we need to enable that ourselves here. try: sys.stdout._line_buffering = True except: pass try: sys.stderr._line_buffering = True except: pass try: sys.stdin._line_buffering = True except: pass try: import org.python.core.PyDictionary #@UnresolvedImport @UnusedImport -- just to check if it could be valid def DictContains(d, key): return d.has_key(key) except: try: #Py3k does not have has_key anymore, and older versions don't have __contains__ DictContains = dict.__contains__ except: try: DictContains = dict.has_key except NameError: def DictContains(d, key): return d.has_key(key) #----------------------------------------------------------------------------------------------------------------------- #now that we've finished the needed pydev sitecustomize, let's run the default one (if available) #Ok, some weirdness going on in Python 3k: when removing this module from the sys.module to import the 'real' #sitecustomize, all the variables in this scope become None (as if it was garbage-collected), so, the the reference #below is now being kept to create a cyclic reference so that it neven dies) __pydev_sitecustomize_module__ = sys.modules.get('sitecustomize') #A ref to this module #remove the pydev site customize (and the pythonpath for it) paths_removed = [] try: for c in sys.path[:]: #Pydev controls the whole classpath in Jython already, so, we don't want a a duplicate for #what we've already added there (this is needed to support Jython 2.5b1 onwards -- otherwise, as #we added the sitecustomize to the pythonpath and to the classpath, we'd have to remove it from the #classpath too -- and I don't think there's a way to do that... or not?) if c.find('pydev_sitecustomize') != -1 or c == '__classpath__' or c == '__pyclasspath__' or \ c == '__classpath__/' or c == '__pyclasspath__/' or c == '__classpath__\\' or c == '__pyclasspath__\\': sys.path.remove(c) if c.find('pydev_sitecustomize') == -1: #We'll re-add any paths removed but the pydev_sitecustomize we added from pydev. paths_removed.append(c) if DictContains(sys.modules, 'sitecustomize'): del sys.modules['sitecustomize'] #this module except: #print the error... should never happen (so, always show, and not only on debug)! import traceback;traceback.print_exc() #@Reimport else: #Now, execute the default sitecustomize try: import sitecustomize #@UnusedImport sitecustomize.__pydev_sitecustomize_module__ = __pydev_sitecustomize_module__ except: pass if not DictContains(sys.modules, 'sitecustomize'): #If there was no sitecustomize, re-add the pydev sitecustomize (pypy gives a KeyError if it's not there) sys.modules['sitecustomize'] = __pydev_sitecustomize_module__ try: if paths_removed: if sys is None: import sys if sys is not None: #And after executing the default sitecustomize, restore the paths (if we didn't remove it before, #the import sitecustomize would recurse). sys.path.extend(paths_removed) except: #print the error... should never happen (so, always show, and not only on debug)! import traceback;traceback.print_exc() #@Reimport if not IS_PYTHON_3K: try: #Redefine input and raw_input only after the original sitecustomize was executed #(because otherwise, the original raw_input and input would still not be defined) import __builtin__ original_raw_input = __builtin__.raw_input original_input = __builtin__.input def raw_input(prompt=''): #the original raw_input would only remove a trailing \n, so, at #this point if we had a \r\n the \r would remain (which is valid for eclipse) #so, let's remove the remaining \r which python didn't expect. ret = original_raw_input(prompt) if ret.endswith('\r'): return ret[:-1] return ret raw_input.__doc__ = original_raw_input.__doc__ def input(prompt=''): #input must also be rebinded for using the new raw_input defined return eval(raw_input(prompt)) input.__doc__ = original_input.__doc__ __builtin__.raw_input = raw_input __builtin__.input = input except: #Don't report errors at this stage if DEBUG: import traceback;traceback.print_exc() #@Reimport else: try: import builtins #Python 3.0 does not have the __builtin__ module @UnresolvedImport original_input = builtins.input def input(prompt=''): #the original input would only remove a trailing \n, so, at #this point if we had a \r\n the \r would remain (which is valid for eclipse) #so, let's remove the remaining \r which python didn't expect. ret = original_input(prompt) if ret.endswith('\r'): return ret[:-1] return ret input.__doc__ = original_input.__doc__ builtins.input = input except: #Don't report errors at this stage if DEBUG: import traceback;traceback.print_exc() #@Reimport try: #The original getpass doesn't work from the eclipse console, so, let's put a replacement #here (note that it'll not go into echo mode in the console, so, what' the user writes #will actually be seen) import getpass #@UnresolvedImport if IS_PYTHON_3K: def pydev_getpass(msg='Password: '): return input(msg) else: def pydev_getpass(msg='Password: '): return raw_input(msg) getpass.getpass = pydev_getpass except: #Don't report errors at this stage if DEBUG: import traceback;traceback.print_exc() #@Reimport