From 218412ac55d689d4511b1e7f57a50f8cf3ff19d3 Mon Sep 17 00:00:00 2001 From: Carlos Cordoba Date: Tue, 18 Jul 2017 15:27:26 -0500 Subject: [PATCH 1/3] Fix error at startup when trying to import Pandas --- spyder/widgets/variableexplorer/importwizard.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/spyder/widgets/variableexplorer/importwizard.py b/spyder/widgets/variableexplorer/importwizard.py index fa2e5d23f49..e0f2904d4be 100644 --- a/spyder/widgets/variableexplorer/importwizard.py +++ b/spyder/widgets/variableexplorer/importwizard.py @@ -22,9 +22,11 @@ QSizePolicy, QSpacerItem, QTableView, QTabWidget, QTextEdit, QVBoxLayout, QWidget) +# If pandas fails to import here (for any reason), Spyder +# will crash at startup. try: import pandas as pd -except ImportError: +except: pd = None # Local import From 4258f007aa9b5ee06522d6daba31fd2372289fbf Mon Sep 17 00:00:00 2001 From: Carlos Cordoba Date: Tue, 18 Jul 2017 16:09:53 -0500 Subject: [PATCH 2/3] Try to make Spyder more robust when importing third-party libraries --- spyder/config/base.py | 6 +++--- spyder/pyplot.py | 2 +- spyder/utils/ipython/spyder_kernel.py | 4 ++-- spyder/utils/site/sitecustomize.py | 14 +++++++------- .../widgets/variableexplorer/collectionseditor.py | 4 ++-- spyder/widgets/variableexplorer/importwizard.py | 4 ++-- spyder/widgets/variableexplorer/utils.py | 13 ++++++++----- 7 files changed, 25 insertions(+), 22 deletions(-) diff --git a/spyder/config/base.py b/spyder/config/base.py index 122077b1157..0ea329a464e 100644 --- a/spyder/config/base.py +++ b/spyder/config/base.py @@ -386,18 +386,18 @@ def get_supported_types(): try: from numpy import ndarray, matrix, generic editable_types += [ndarray, matrix, generic] - except ImportError: + except: pass try: from pandas import DataFrame, Series, DatetimeIndex editable_types += [DataFrame, Series, DatetimeIndex] - except ImportError: + except: pass picklable_types = editable_types[:] try: from spyder.pil_patch import Image editable_types.append(Image.Image) - except ImportError: + except: pass return dict(picklable=picklable_types, editable=editable_types) diff --git a/spyder/pyplot.py b/spyder/pyplot.py index affd277ca05..557540ea79f 100644 --- a/spyder/pyplot.py +++ b/spyder/pyplot.py @@ -5,5 +5,5 @@ try: from guiqwt.pyplot import * -except (ImportError, AssertionError): +except: from matplotlib.pyplot import * diff --git a/spyder/utils/ipython/spyder_kernel.py b/spyder/utils/ipython/spyder_kernel.py index e61b6209a48..dc94d85cc22 100644 --- a/spyder/utils/ipython/spyder_kernel.py +++ b/spyder/utils/ipython/spyder_kernel.py @@ -328,7 +328,7 @@ def _is_array(self, var): try: import numpy return isinstance(var, numpy.ndarray) - except ImportError: + except: return False def _is_image(self, var): @@ -336,7 +336,7 @@ def _is_image(self, var): try: from PIL import Image return isinstance(var, Image.Image) - except ImportError: + except: return False def _is_data_frame(self, var): diff --git a/spyder/utils/site/sitecustomize.py b/spyder/utils/site/sitecustomize.py index 8deb40d7021..4b7eb95cb38 100644 --- a/spyder/utils/site/sitecustomize.py +++ b/spyder/utils/site/sitecustomize.py @@ -133,7 +133,7 @@ def execfile(filename, namespace): except (ValueError, TypeError): # Code page number in locale is not valid pass - except ImportError: + except: pass @@ -173,7 +173,7 @@ def execfile(filename, namespace): import pyximport HAS_PYXIMPORT = True pyx_setup_args = {} -except ImportError: +except: HAS_PYXIMPORT = False if HAS_PYXIMPORT: @@ -181,7 +181,7 @@ def execfile(filename, namespace): try: import numpy pyx_setup_args['include_dirs'] = numpy.get_include() - except ImportError: + except: pass # Setup pyximport and enable Cython files reload @@ -191,7 +191,7 @@ def execfile(filename, namespace): # Import cython_inline for runfile function from Cython.Build.Inline import cython_inline HAS_CYTHON = True -except ImportError: +except: HAS_CYTHON = False @@ -200,7 +200,7 @@ def execfile(filename, namespace): #============================================================================== try: import sitecustomize #analysis:ignore -except ImportError: +except: pass @@ -234,7 +234,7 @@ def _getfilesystemencoding_wrapper(): #============================================================================== try: import matplotlib -except (ImportError, UnicodeDecodeError): +except: matplotlib = None # analysis:ignore @@ -290,7 +290,7 @@ def __init__(self, *args, **kwargs): warnings.filterwarnings(action='ignore', category=RuntimeWarning, module='pandas.formats.format', message=".*invalid value encountered in.*") -except (ImportError, AttributeError): +except: pass diff --git a/spyder/widgets/variableexplorer/collectionseditor.py b/spyder/widgets/variableexplorer/collectionseditor.py index 40f00856379..28015ac79b0 100644 --- a/spyder/widgets/variableexplorer/collectionseditor.py +++ b/spyder/widgets/variableexplorer/collectionseditor.py @@ -1007,13 +1007,13 @@ def __prepare_plot(self): try: import guiqwt.pyplot #analysis:ignore return True - except (ImportError, AssertionError): + except: try: if 'matplotlib' not in sys.modules: import matplotlib matplotlib.use("Qt4Agg") return True - except ImportError: + except: QMessageBox.warning(self, _("Import error"), _("Please install matplotlib" " or guiqwt.")) diff --git a/spyder/widgets/variableexplorer/importwizard.py b/spyder/widgets/variableexplorer/importwizard.py index e0f2904d4be..2c9fa9c5106 100644 --- a/spyder/widgets/variableexplorer/importwizard.py +++ b/spyder/widgets/variableexplorer/importwizard.py @@ -60,7 +60,7 @@ class FakeObject(object): pass try: from numpy import ndarray, array -except ImportError: +except: class ndarray(FakeObject): # analysis:ignore """Fake ndarray""" pass @@ -69,7 +69,7 @@ class ndarray(FakeObject): # analysis:ignore import datetime try: from dateutil.parser import parse as dateparse -except ImportError: +except: def dateparse(datestr, dayfirst=True): # analysis:ignore """Just for 'day/month/year' strings""" _a, _b, _c = list(map(int, datestr.split('/'))) diff --git a/spyder/widgets/variableexplorer/utils.py b/spyder/widgets/variableexplorer/utils.py index 2f195b9d186..4a4c7c59045 100644 --- a/spyder/widgets/variableexplorer/utils.py +++ b/spyder/widgets/variableexplorer/utils.py @@ -53,7 +53,7 @@ class FakeObject(object): from numpy.ma import MaskedArray from numpy import savetxt as np_savetxt from numpy import get_printoptions, set_printoptions -except ImportError: +except: ndarray = array = matrix = recarray = MaskedArray = np_savetxt = \ int64 = int32 = float64 = float32 = complex64 = complex128 = FakeObject @@ -81,7 +81,10 @@ def get_numpy_dtype(obj): # Pandas support #============================================================================== if programs.is_module_installed('pandas', PANDAS_REQVER): - from pandas import DataFrame, DatetimeIndex, Series + try: + from pandas import DataFrame, DatetimeIndex, Series + except: + DataFrame = DatetimeIndex = Series = FakeObject else: DataFrame = DatetimeIndex = Series = FakeObject # analysis:ignore @@ -92,7 +95,7 @@ def get_numpy_dtype(obj): try: from spyder import pil_patch Image = pil_patch.Image.Image -except ImportError: +except: Image = FakeObject # analysis:ignore @@ -102,7 +105,7 @@ def get_numpy_dtype(obj): try: import bs4 NavigableString = bs4.element.NavigableString -except (ImportError, AttributeError): +except: NavigableString = FakeObject # analysis:ignore @@ -168,7 +171,7 @@ def get_object_attrs(obj): try: from dateutil.parser import parse as dateparse -except ImportError: +except: def dateparse(datestr): # analysis:ignore """Just for 'year, month, day' strings""" return datetime.datetime( *list(map(int, datestr.split(','))) ) From ec9fdbfb444033b9515a86a30cb79bac52f4e2d7 Mon Sep 17 00:00:00 2001 From: Carlos Cordoba Date: Sun, 23 Jul 2017 19:12:30 -0500 Subject: [PATCH 3/3] Add LANG and LC_ALL env vars to prevent Spyder from crashing in macOS --- spyder/app/start.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/spyder/app/start.py b/spyder/app/start.py index 213aa0810e4..4dd2e4be0ee 100644 --- a/spyder/app/start.py +++ b/spyder/app/start.py @@ -76,6 +76,20 @@ def main(): else: os.environ['QT_SCREEN_SCALE_FACTORS'] = '' + # Prevent Spyder from crashing in macOS if locale is not defined + if sys.platform == 'darwin': + LANG = os.environ.get('LANG') + LC_ALL = os.environ.get('LC_ALL') + if bool(LANG) and not bool(LC_ALL): + LC_ALL = LANG + elif not bool(LANG) and bool(LC_ALL): + LANG = LC_ALL + else: + LANG = LC_ALL = 'en_US.UTF-8' + + os.environ['LANG'] = LANG + os.environ['LC_ALL'] = LC_ALL + if CONF.get('main', 'single_instance') and not options.new_instance \ and not options.reset_config_files and not running_in_mac_app(): # Minimal delay (0.1-0.2 secs) to avoid that several