Конфигурация запуска ipython для spyder IDE

Пытаюсь добавить несколько импортов в свой профиль IPython, чтобы при открытии ядра в Spyder IDE они всегда загружались. Spyder имеет интерфейс Qt (я думаю??), поэтому я (а) проверил, чтобы убедиться, что я был в правильном каталоге для профиля, используя команду ipython locate в терминале (OSX), и (б) поместив следующий код в мой ipython_qtconsole_config.py файл:

c.IPythonQtConsoleApp.exec_lines = ["import pandas as pd", 
                                "pd.set_option('io.hdf.default_format', 'table')",
                                "pd.set_option('mode.chained_assignment','raise')",
                                "from __future__ import division, print_function"]

Но когда я открываю новое окно и набираю pd.__version__, я получаю ошибку NameError: name 'pd' is not defined.

Редактировать: у меня нет проблем, если я запускаю ipython qtconsole из терминала.

Предложения?

Спасибо!


person nick_eu    schedule 17.08.2015    source источник


Ответы (1)


Использует ли Spyder интерфейс QT или нет, это не должно быть связано с тем, какой из файлов конфигурации IPython вы хотите изменить. Тот, который вы решили изменить, ipython_qtconsole_config.py — это файл конфигурации, который загружается при запуске консоли QT IPython, например, с помощью команды командной строки

user@system:~$ ipython qtconsole

(Мне нужно было обновить pyzmq, чтобы это заработало.)

Если Spyder поддерживает работающее ядро ​​IPython и просто управляет тем, как отображать его для вас, то Spyder, вероятно, просто поддерживает обычный сеанс IPython, и в этом случае вы хотите, чтобы ваши настройки конфигурации попали в файл ipython_config.py по адресу тот же каталог, где вы нашли ipython_qtconsole_config.py.

Я справляюсь с этим немного иначе, чем вы. Внутри ipython_config.py несколько верхних строк для меня выглядят так:

# Configuration file for ipython.
from os.path import join as pjoin
from IPython.utils.path import get_ipython_dir

c = get_config()
c.InteractiveShellApp.exec_files = [
    pjoin(get_ipython_dir(), "profile_default", "launch.py")
]

Что это делает, так это получает для меня каталог конфигурации IPython, добавляет подкаталог profile_default, а затем добавляет имя launch.py, которое является файлом, который я создал только для хранения всего, что я хочу выполнить/загрузить при запуске.

Например, вот первый бит из моего файла launch.py:

"""
IPython launch script
Author: Ely M. Spears
"""

import re
import os
import abc
import sys
import mock
import time
import types
import pandas
import inspect
import cPickle
import unittest
import operator
import warnings
import datetime
import dateutil
import calendar
import copy_reg
import itertools
import contextlib
import collections
import numpy as np
import scipy as sp
import scipy.stats as st
import scipy.weave as weave
import multiprocessing as mp
from IPython.core.magic import (
    Magics,
    register_line_magic,
    register_cell_magic,
    register_line_cell_magic
)
from dateutil.relativedelta import relativedelta as drr


###########################
# Pickle/Unpickle methods #
###########################

# See explanation at:
# < http://bytes.com/topic/python/answers/
#   552476-why-cant-you-pickle-instancemethods >
def _pickle_method(method):
    func_name = method.im_func.__name__
    obj = method.im_self
    cls = method.im_class
    return _unpickle_method, (func_name, obj, cls)

def _unpickle_method(func_name, obj, cls):
    for cls in cls.mro():
        try:
            func = cls.__dict__[func_name]
        except KeyError:
            pass
        else:
            break
    return func.__get__(obj, cls)

copy_reg.pickle(types.MethodType, _pickle_method, _unpickle_method)

#############
# Utilities #
#############
def interface_methods(*methods):
    """
    Class decorator that can decorate an abstract base class with method names
    that must be checked in order for isinstance or issubclass to return True.
    """
    def decorator(Base):
        def __subclasshook__(Class, Subclass):
            if Class is Base:
                all_ancestor_attrs = [ancestor_class.__dict__.keys()
                                      for ancestor_class in Subclass.__mro__]
                if all(method in all_ancestor_attrs for method in methods):
                    return True
            return NotImplemented
        Base.__subclasshook__ = classmethod(__subclasshook__)
        return Base

def interface(*attributes):
    """
    Class decorator checking for any kind of attributes, not just methods.

    Usage:

    @interface(('foo', 'bar', 'baz))
    class Blah
       pass

    Now, new classes will be treated as if they are subclasses of Blah, and 
    instances will be treated instances of Blah, provided they possess the
    attributes 'foo', 'bar', and 'baz'.
    """
    def decorator(Base):
        def checker(Other):
            return all(hasattr(Other, a) for a in attributes)

        def __subclasshook__(cls, Other):
            if checker(Other):
                return True
            return NotImplemented

        def __instancecheck__(cls, Other):
            return checker(Other)

        Base.__metaclass__.__subclasshook__ = classmethod(__subclasshook__)
        Base.__metaclass__.__instancecheck__ = classmethod(__instancecheck__)
        return Base
    return decorator

Есть намного больше, вероятно, десятки вспомогательных функций, фрагменты кода, которые я считаю крутыми и с которыми просто хочется поиграть, и т. д. Я также определяю некоторые случайно сгенерированные игрушечные наборы данных, такие как массивы NumPy и Pandas DataFrames, так что, когда я хотите поковыряться с каким-то одноразовым синтаксисом Pandas или чем-то еще, какие-то игрушечные данные всегда тут же.

Другим преимуществом является то, что это учитывает пользовательский импорт, определения функций и т. д., которые я хочу загрузить, поэтому, если я хочу, чтобы одни и те же вещи были загружены для ноутбука и/или консоли qt, я могу просто добавить тот же фрагмент кода в exec файл launch.py, и я могу вносить изменения только launch.py без необходимости вручную переносить их в каждый из трех файлов конфигурации.

Я также раскомментировал несколько различных настроек, особенно для простого IPython и для ноутбука, поэтому файлы конфигурации существенно отличаются друг от друга, просто не в зависимости от того, какие модули я хочу импортировать при запуске.

person ely    schedule 17.08.2015