2014-02-04 4 views
2

Так что - хорошие люди в ROOT сообщества сделал следующее волшебство:`get_ipython 'не работает в сценарии запуска для IPython/IPython Notebook ...?

# This is for intercepting the output of ROOT 
# In a cell, put %%rootprint so that the output that would normally be 
# sent directly to the stdout will instead be displayed in the cell. 
# It must be the first element in the cell. 
import tempfile 
import ROOT 
from IPython.core.magic import (Magics, magics_class, cell_magic) 

@magics_class 
class RootMagics(Magics): 
    """Magics related to Root. 

    %%rootprint - Capture Root stdout output and show in result cell 
    """ 

    def __init__(self, shell): 
     super(RootMagics, self).__init__(shell) 

    @cell_magic 
    def rootprint(self, line, cell): 
     """Capture Root stdout output and print in ipython notebook.""" 

     with tempfile.NamedTemporaryFile() as tmpFile: 

      ROOT.gSystem.RedirectOutput(tmpFile.name, "w") 
      # ns = {} 
      # exec cell in self.shell.user_ns, ns 
      exec cell in self.shell.user_ns 
      ROOT.gROOT.ProcessLine("gSystem->RedirectOutput(0);") 
      print tmpFile.read() 

# Register 
ip = get_ipython() 
ip.register_magics(RootMagics) 

Это прекрасно работает, если я Ye Olde import rootprint в клетке в моей IPython ноутбука - жалоб нет, и все это работает, как ожидалось. Но теперь я хочу импортировать это и делать некоторые вещи в файле python в файлах ~/.ipython/profile/startup - python в этом каталоге, по-видимому, запускается при первом запуске IPython, позволяя получить доступ к тому, что вы определили в нем. Если я просто делаю что-то простое (это не import rootprint), все работает точно так, как ожидалось - я могу сделать функцию в сценарии запуска и использовать ее позже по своему усмотрению. Но когда я пытаюсь import rootprint в сценарии запуска и затем запустить IPython (только IPython, а не ноутбук сейчас), он переворачивается с жалобой:

--------------------------------------------------------------------------- 
NameError         Traceback (most recent call last) 
/usr/lib/python2.6/site-packages/ipython-1.1.0-py2.6.egg/IPython/utils/py3compat.pyc in execfile(fname, *where) 
    202    else: 
    203     filename = fname 
--> 204    __builtin__.execfile(filename, *where) 

/home/wjmills/.ipython/profile_nbserver/startup/dummy.py in <module>() 
     2 import ROOT 
     3 from ROOT import gROOT, TCanvas, TF1, TFile, TTree, gRandom, TH1F 
----> 4 import numpy, rootprint 
     5 
     6 def foo(): 

/home/wjmills/.ipython/profile_nbserver/startup/rootprint.py in <module>() 
    31 
    32 # Register 
---> 33 ip = get_ipython() 
    34 ip.register_magics(RootMagics) 

NameError: name 'get_ipython' is not defined 

Что происходит с get_ipython в контексте питона сценария запускать при запуске из профиля/запуска? Опять же, все это прекрасно работает, если я делаю это интерактивно из ноутбука IPython, поэтому, похоже, что-то особенное в отношении процедуры запуска. Заранее спасибо!

ответ

0

Я думаю, что предпочтительный способ зарегистрировать свою магию является

def load_ipython_extension(ip): 
    """Load the extension in IPython.""" 
    ip.register_magics(RootMagics) 
5

Это неполный предложение - но если get_ipython не в пространстве имен, то вы можете попробовать импортировать его непосредственно:

from IPython import get_ipython 
ipython_shell = get_ipython() 

Кроме того, ipython имеет другое поведение при импорте файлов .py в файлы .ipy. Вы можете попробовать сохранить rootprint как .ipy-файл.

Я не уверен, что буду классифицировать это как решение, если оно работает, но оно может указывать на вас в правильном направлении.

Смежные вопросы