2016-11-04 63 views
1

我想編寫一個python腳本,它可以從現有的ipython內核中導入所有本地變量。從ipython內核導入變量到python腳本

我看了一下ipython API,但沒有真正找到我想要的。

下面是一些更精確的問題:

1 - 是否有一個函數從IPython的API來列出所有現有的活動IPython的內核?

2 - 是否有可能從內核獲取所有變量而不啓動嵌入ipython?

編輯:這背後的想法是讓一個變量資源管理器在文本模式下蟒蛇,可以實時顯示在一個給定的核局部/全局變量

編輯:我寫了下面的類哪些是我想要的。但是,我認爲這不是最佳的。特別是,get_iopub_message很無聊。事實上,它可以獲得所有的消息(甚至是'空閒'和'繁忙'),但是我沒有找到更直接的方法來訪問who輸出。

class Watcher(Thread): 
    def __init__(self, km, delay): 
     Thread.__init__(self) 
     self.km = km 
     self.delay = delay 
     self.msg, self.variables = self.InitWhos() 

    def run(self): 
     ''' Main loop ''' 
     while True: 
      try: 
       data = self.km.get_iopub_msg(timeout=0.1) 
       self.msg = 1 
      except Empty: 
       pass 
      else: 
       try: 
        if data['content']['execution_state'] == 'idle' and self.msg == 1: 
         self.msg, self.variables = self.Whos() 
       except KeyError: 
        pass 

      sleep(self.delay) 

    def Whos(self): 
     ''' Execute whos in the kernel and get output ''' 
     self.km.shell_channel.execute('whos', store_history=None) 
     while self.msg == 1: 
      try : 
       data = self.km.get_iopub_msg(timeout=0.1) 
       self.variables = data['content']['data'] 
      except KeyError: 
       pass 
      else: 
       data = self.km.get_iopub_msg(timeout=0.1) 
       self.msg = 0 
     return self.msg, self.variables 

    def InitWhos(self): 
     ''' Init variables on startup ''' 
     self.msg = 1 
     return self.Whos() 
+0

你可以保存感興趣的變量,而不是文件?例如,使用'cPickle',然後在腳本中加載它們? –

+0

我編輯了我的帖子。事實上,我希望我的腳本能夠實時顯示變量 –

+1

要查找由筆記本服務器啓動的所有內核,請查看[此代碼](https://github.com/takluyver/nbmanager/blob/master/nbmanager /api.py)。例如。 '用於NbServer.findall()中的服務器:print(server.sessions())'。然後在內核中,您可以設置一些監聽'post_run_cell' [event](http://ipython.readthedocs.io/en/stable/config/callbacks.html)的變量來將變量發送到您的進程。 –

回答

0

我不能用1幫助,但2可能使用inspect模塊成爲可能,見here。我認爲如果你想從一個單獨的進程檢查一個內核,你會掙扎...