2011-08-08 10 views
14

私は、非OOの方法で書かれたPython 2.x APIとやり取りしています。それはもはやシングルトンではなく、元のコード(私たちではない)を変更することはオプションではありません。Pythonモジュールの2つの独立したインスタンスを取得します。

個別のインタプリタのサブプロセス実行を使用するのが短く、モジュールから外してモジュールの複数のインスタンスとやりとりする(つまりオブジェクトとして扱う)方法はありますか?

モジュールを使用して2つの異なる設定を駆動する必要があります。これは内部的には動作しません。

免責事項:しないでください。非常に奇妙な状況の場合にのみこれを実行し、これを行う前に状況を他の方法で変更しようとしてください。私は尋ねる時に変更できない奇妙なコードに対処するためにこれを行いました。より奇妙なコードを増殖させる方法を提供しないようにしました。

+1

[実行時にPythonモジュールのコピーを作成するにはどうすればいいですか?](https://stackoverflow.com/questions/11170949/how-to-make-a-copy-of-a-python-module -at-runtime) – ThorSummoner

+0

@ThorSummonerはい、これはかなり良いトップの答えと思います。 –

答えて

1

私は個人的に使用していませんが、Exocetライブラリが役立つようです。

+1

私はこれを扱うライブラリの使用が好きです - sysと直接関係するよりもはるかに優れている可能性が高く、バグがあれば報告/修正することができます。 –

13

ちょうどsys.modulesからモジュールを削除します。

>>> import sys 
>>> import mod as m1 
>>> m1.x = 1 
>>> del sys.modules['mod'] 
>>> import mod as m2 
>>> m2.x = 2 
>>> m1.x 
1 
+0

これは、Pythonのすべてのクラスを冗長にしますか? (モジュールは代わりに使用できるので) – mulllhausen

+0

クラスとモジュールの両方に名前空間がありますが、類似点はそこで終わりです。たとえば、モジュールは呼び出し可能ではないため、クラスを置き換えることはできません。 – phihag

+0

歓声。私の目的のために、私は完全にクラスなしで行くことができると思う。私が通常クラスを使用する唯一の理由は、基本機能を拡張するためです。私はまだモジュールでこれを行うことができると思うが、私は明示的に "子"モジュールまたは "親"モジュールを必要に応じて呼び出さなければならない。その少しだけ思考した努力ですが、呼び出された関数がとにかく生きている場所を考えるのに便利です。 – mulllhausen

3

あなたが試すことができだましsys.modules

import badmodule as badmod1 

import sys 
del sys.modules['badmodule'] 

import badmodule as badmod2 

この作品かどうか、もちろん悪いモジュールが何をしているかに依存している場合

によって..

0

最も簡単な方法は、モジュールを2つコピーして別々にインポートすることです。たとえば、モジュールthingabobberをとり、thingabobber1thingabobber2の2つのコピーを作成します。それからちょうど:これが不可能な場合は、第二インポート時に2番目のコピーを入手して

import thingabobber1, thingabobber2 

は、最初にそれをインポートした後sys.modulesからモジュールを削除します。

import sys 

import thingabobber as thingabobber1 
del sys.modules["thingabobber"] 
import thingabobber as thingabobber2 
0

これは、異なるパスでモジュールをインポートすることで実現できます。 これは、sys.pathにモジュールへの2つの異なる点線ルートがある場合、モジュールキャッシュは、異なるシンボルツリー、グローバルなどを持つモジュールの2つの異なるインスタンスを作成します。

これを使用して、複数のバージョンのライブラリを使用することもできます。

誤った記号をキャッチしようとしているため、例外がキャッチされないように注意してください。

関連する問題