-1

同じ 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()
4

1 に答える 1

2

推奨されていませんが、これができることです。

  • 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.excepthooksympyとなどの2つの巨大なライブラリで発生する問題を想像することしかできませんnumpy

注: 単純なものを実行したいだけの場合は、グローバルをいじることができ、大丈夫です。

于 2012-12-31T08:27:05.697 に答える