From 52feabbe7641f19a17810438d2469b2395b2819f Mon Sep 17 00:00:00 2001 From: Paul Molodowitch Date: Wed, 24 Oct 2012 11:27:52 -0700 Subject: added setdefaultencoding method so reload(sys) not needed reload(sys) could cause problem in user code - ie, sys.stdout, excepthook, and displayhook would be reset, etc --- sleekxmpp/basexmpp.py | 4 ++-- sleekxmpp/util/misc_ops.py | 24 ++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) (limited to 'sleekxmpp') diff --git a/sleekxmpp/basexmpp.py b/sleekxmpp/basexmpp.py index 4df7f11a..c3ff5ba3 100644 --- a/sleekxmpp/basexmpp.py +++ b/sleekxmpp/basexmpp.py @@ -43,8 +43,8 @@ log = logging.getLogger(__name__) # In order to make sure that Unicode is handled properly # in Python 2.x, reset the default encoding. if sys.version_info < (3, 0): - reload(sys) - sys.setdefaultencoding('utf8') + from sleekxmpp.util.misc_ops import setdefaultencoding + setdefaultencoding('utf8') class BaseXMPP(XMLStream): diff --git a/sleekxmpp/util/misc_ops.py b/sleekxmpp/util/misc_ops.py index 9bb1db4b..3b246625 100644 --- a/sleekxmpp/util/misc_ops.py +++ b/sleekxmpp/util/misc_ops.py @@ -125,3 +125,27 @@ def hashes(): t += ['MD2'] hashes = ['SHA-' + h[3:] for h in dir(hashlib) if h.startswith('sha')] return t + hashes + +def setdefaultencoding(encoding): + """ + Set the current default string encoding used by the Unicode implementation. + + Actually calls sys.setdefaultencoding under the hood - see the docs for that + for more details. This method exists only as a way to call find/call it + even after it has been 'deleted' when the site module is executed. + + :param string encoding: An encoding name, compatible with sys.setdefaultencoding + """ + func = getattr(sys, 'setdefaultencoding', None) + if func is None: + import gc + import types + for obj in gc.get_objects(): + if (isinstance(obj, types.BuiltinFunctionType) + and obj.__name__ == 'setdefaultencoding'): + func = obj + break + if func is None: + raise RuntimeError("Could not find setdefaultencoding") + sys.setdefaultencoding = func + return func(encoding) \ No newline at end of file -- cgit v1.2.3