2012-12-31 3 views
-1

동일한 아이디어를 구현하는 방법. 동일한 작업을 파이썬 메인 세션을 종료하지 않고 개별적으로 수행합니다.파이썬에서 독립적 인 서브 세션을 시작하고 종료하십시오.

>>> 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

이 '세션'은 정확히 무엇입니까? – jadkik94

+0

왜 이것을하고 싶습니까? –

+0

@ jadkik94'Session'은 ** ** 질문입니다! 그러나 보시다시피,'Session.Start'는 세션을 격리 시키므로 다른 패키지의 유사한 객체들 사이에는 충돌이 없습니다. – Developer

답변

2

을, 이것은 당신이 무엇을 할 수 있습니다 : 세션을 시작

  • sys.pathsys.modules의 상태를 저장 , 그리고 전역.
  • 어떤 일이 발생하더라도 이러한 효과가있을 것입니다.
  • 세션을 중지하면 이전에 시작된 세션의 상태가 복원됩니다.

참고 :이 내용은 완벽하지 않으므로 권장하지 않습니다. from sympy import * 대신에 import sympy으로 무엇이 잘못되었는지 실제로 알 수 없습니다.

편집 :

이 접근을 가진 글로벌 범위를 수정하면, 예를 들어이보기 ... 쉽지 않고 많은 문제에서 당신을 얻을 것이다 보인다

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 
>>> 

당신은 (afterNameError을 제기으로) 작동 볼 수 있지만, 거기에 수 sys.excepthook에있는 일부 모듈에서 발생하는 다른 문제. sympynumpy과 같이 2 개의 거대한 라이브러리에서 발생하는 문제 만 상상할 수 있습니다.

참고 : 당신은 단지 전역에, 당신이 할 수있는 단지 혼란, 간단한 일이 실행을 원하는 당신은 종류의 확인을 할 수 있습니다합니다.

+0

그 안에있는 어떤 오브젝트에 대해서도 sympy 접두사를 갖는 것은 깔끔한 것이 아닙니다. 그것은 지저분한 것들을 만듭니다.우리는 격리 된 작업을 수행하기 위해 다른 파이썬 세션 (다른 창)을 실행할 수 있지만 완벽하지는 않습니다! 권리? – Developer

+1

@Developer 사실, 그렇습니다. –

+0

@Developer @ 답사 제 대답에서 언급 한 방법으로 다른 물건을 작업 할 때 별난 일들을 많이 발견 할 수 있습니다 ... 그래서이 혼란에 빠지기를 원치 않을 수도 있습니다 :) 그리고 실제 코드로 만들려고합니다. , 그리고 그것은 정말로 * 큰 혼란처럼 보입니다. – jadkik94

관련 문제