雖然不建議它,這是你可以做什麼:
- 啓動會話保存的
sys.modules
,sys.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個巨大的庫,如sympy
和numpy
。
注: 如果你只是想簡單的東西跑,你可以用全局的混亂,你會是那種確定。
這個'Session'究竟是什麼? – jadkik94
你爲什麼要這樣做? –
@ jadkik94'Session'是**問題**!但是,正如你所看到的那樣,'Session.Start'會隔離會話,所以不同包之間的類似對象之間沒有衝突。 – Developer