2012-12-31 54 views
-1

如何實現下面的想法,在這個想法中不同的工作是在不退出同一個Python主會話的情況下單獨完成的。在Python中開始和結束一個獨立的子會話

>>> Session.Start() 
>>> from sympy import * 
>>> x = Symbol('x') 
>>> ...   #do the job 
>>> Session.End() 

,並使用其它軟件包另一個會話:

>>> Session.Start() 
>>> from numpy import * 
>>> x = array([1,2,3,4]) 
>>> ...   #do the job 
>>> Session.End() 
+1

這個'Session'究竟是什麼? – jadkik94

+0

你爲什麼要這樣做? –

+0

@ jadkik94'Session'是**問題**!但是,正如你所看到的那樣,'Session.Start'會隔離會話,所以不同包之間的類似對象之間沒有衝突。 – Developer

回答

2

雖然不建議它,這是你可以做什麼:

  • 啓動會話保存的sys.modulessys.path狀態,和全局。
  • 無論發生什麼都會對這些(也可能是其他)產生一些影響。
  • 停止會話將恢復先前啓動的會話的狀態。

您應該注意,這不是完美的,不建議。我真的不知道import sympy而不是from sympy import *有什麼問題。

編輯:

似乎能夠訪問和修改在全球範圍內是不容易的,將讓你在很多麻煩......比如看到這個:

class Session(object): 
    def __init__(self, gref): 
     self.init() 
     self.gref = gref 

    def init(self): 
     self.modules = {} 
     self.path = None 
     self.glob = {} 

    def start(self): 
     import sys 
     self.modules = sys.modules.copy() 
     self.path = sys.path[:] 
     self.glob = self.gref.copy() 
     self.gref['test'] = 'abc' 

    def stop(self): 
     import sys 
     sys.modules = self.modules.copy() 
     sys.path = self.path[:] 
     for k in self.gref.keys(): 
      del self.gref[k] 
     self.gref.update(self.glob) 

    def __repr__(self): 
     return repr(self.glob) 

運行它:

Python 2.7.3 (default, Aug 1 2012, 05:16:07) 
[GCC 4.6.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from sessionpy import Session 
>>> s = Session(globals()) 
>>> before = 123 
>>> s.start() 
>>> after = 456 
>>> s.stop() 
>>> after 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'after' is not defined 
Error in sys.excepthook: 
Traceback (most recent call last): 
    File "/usr/lib/python2.7/dist-packages/apport_python_hook.py", line 66, in apport_excepthook 
    from apport.fileutils import likely_packaged, get_recent_crashes 
    File "/usr/lib/python2.7/dist-packages/apport/__init__.py", line 1, in <module> 
    from apport.report import Report 
    File "/usr/lib/python2.7/dist-packages/apport/report.py", line 18, in <module> 
    import problem_report 
    File "/usr/lib/python2.7/dist-packages/problem_report.py", line 15, in <module> 
    from email.encoders import encode_base64 
    File "/usr/lib/python2.7/email/__init__.py", line 115, in <module> 
    setattr(sys.modules['email'], _name, importer) 
KeyError: 'email' 

Original exception was: 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'after' is not defined 
>>> before 
123 
>>> 

你可以看到它的工作原理(如after提出了NameError),但有一個sys.excepthook中某些模塊出現其他問題。我只能想象你將遇到的問題與2個巨大的庫,如sympynumpy

注: 如果你只是想簡單的東西跑,你可以用全局的混亂,你會是那種確定。

+0

對於任何對象都有sympy前綴並不是很整潔。它使事情變得混亂。我們可能會運行另一個Python會話(所以另一個窗口)來完成這項工作,但它並不完美!對? – Developer

+1

@Developer其實,它是。 –

+0

@Developer在我的回答中提到的方法中,當處理其他內容時,您可能會遇到很多奇怪的事情......所以您可能不想陷入這個混亂局面:)而且我試圖讓它成爲實際的代碼,它看起來像一個真正的大混亂。 – jadkik94