2017-01-09 5 views
1

私は古いピクルスファイルを持っている、と私はそれをロードしようとしたとき、私はoldnameはずっと前newnameに名前が変更されましたので、これは古いピクルファイルを読み込む方法は?

ImportError: No module named oldname.submodule 

エラーが発生します。

このピクルファイルをロードするにはどうすればよいですか?

私はnewnameからoldnameからシンボリックリンクを作成することができますが、私は、ファイルシステムに触れることなくnewname.*参照oldname.*モジュールを作るための方法があるかどうだろうか?

+0

実際のモジュールもインポートすると、2つの名前空間があるため、シンボリックリンクさえ危険です。モジュールがグローバルステートを使用すると、問題が発生する可能性があります。おそらく、あなたは 'sys.modules ['oldname'] = sys.modules ['newname']'とすることができます。 – tdelaney

答えて

0

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> 

注意:クラス自体が多く変更された場合は、とにかく失敗します。

関連する問題