2番目の並列モジュールと外部依存関係を作成するシンボリックリンクの代わりに、sys.modules
にエントリを追加します。テストするために、私はその後、モジュール
[email protected] ~/tmp $ cat oldname.py
class Foo(object):
def __init__(self):
self.name = 'bar'
[email protected] ~/tmp $ python
Python 2.7.6 (default, Oct 26 2016, 20:30:19)
[GCC 4.8.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import oldname
>>> foo = oldname.Foo()
>>> foo.name
'bar'
>>> import pickle
>>> pickle.dump(foo, open('test.pkl', 'wb'), 2)
>>> exit()
[email protected] ~/tmp $ mv oldname.py newname.py
[email protected] ~/tmp $ rm oldname.*
今すぐロードが
[email protected] ~/tmp $ python
Python 2.7.6 (default, Oct 26 2016, 20:30:19)
[GCC 4.8.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import newname
>>> import pickle
>>> foo = pickle.load(open('test.pkl', 'rb'))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/pickle.py", line 1378, in load
return Unpickler(file).load()
File "/usr/lib/python2.7/pickle.py", line 858, in load
dispatch[key](self)
File "/usr/lib/python2.7/pickle.py", line 1090, in load_global
klass = self.find_class(module, name)
File "/usr/lib/python2.7/pickle.py", line 1124, in find_class
__import__(module)
ImportError: No module named oldname
を失敗した。しかし、私はsys.modulesにモジュールを複製した場合、それは動作します。名前を変更したクラスのインスタンスを漬け興味深いことに、クラスインスタンスには新しいモジュール名があります。
>>> import sys
>>> sys.modules['oldname'] = sys.modules['newname']
>>> foo = pickle.load(open('test.pkl', 'rb'))
>>> foo
<newname.Foo object at 0x7f6b837d3310>
注意:クラス自体が多く変更された場合は、とにかく失敗します。
実際のモジュールもインポートすると、2つの名前空間があるため、シンボリックリンクさえ危険です。モジュールがグローバルステートを使用すると、問題が発生する可能性があります。おそらく、あなたは 'sys.modules ['oldname'] = sys.modules ['newname']'とすることができます。 – tdelaney